2016-10-25 7 views
-2

Предположим, у меня есть два CSV-файла, каждый из которых имеет 100 строк. Каждая строка в двух файлах CSV имеет один и тот же индекс и метку, таким образом, эти 100 строк можно рассматривать как набор парных данных.shuffle CSV файлы данных в соответствии с их метками

Моя цель - перетасовать файлы из CSV, чтобы сделать данные непарными в соответствии с их разными метками.

Например, входной сигнал:

1st CSV   2nd CSV   label 
data_1    data_1'   12 
data_2    data_2'   6 
...    ...    ... 

Выход:

data_1    data_2'  
...     ... 

Поскольку данные_1 и данные_2' имеет различные метки (12 и 6 соответственно), таким образом, они рассматриваются как непарные данные. Моя цель - выбрать любое количество данных с разными метками с данными_1.

Есть ли какие-либо библиотеки или методы python для его создания?

+0

Он принимает 3 шага: прочитать данные, используя [CSV] (https://docs.python.org/ 2/library/csv.html), перетасуйте данные с помощью [random] (https://docs.python.org/2/library/random.html), напишите данные, используя [csv] (https: // docs. python.org/2/library/csv.html) – zvone

+0

@zvone Как убедиться, что данные непарные с разными метками? – Kun

+0

Если вы перетасовываете его, он будет непарным. Шанс иметь матч на 100 рядах после перетасовки составляет от 1 до 9.33e + 157 – zvone

ответ

0

Вы можете перемешать содержимое csv, используя функцию python random.shuffle(). Вот пример/тестовый код в python:

> cat ./shuffle_rows.py 
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

data = "" 
for i in range(5): 
    data += "label_%d, data_%d, ...\n" % (i, i) 

print("======== Input ========") 
print data 

import random 
data = data.split("\n") 
random.shuffle(data) # shuffle modifies the sequence 
data="\n".join(data) 

print("======== Output ========") 
print data 

> ./shuffle_rows.py 
======== Input ======== 
label_0, data_0, ... 
label_1, data_1, ... 
label_2, data_2, ... 
label_3, data_3, ... 
label_4, data_4, ... 

======== Output ======== 
label_1, data_1, ... 

label_4, data_4, ... 
label_2, data_2, ... 
label_3, data_3, ... 
label_0, data_0, ... 
+0

Я не понимал, что кто-то уже ответил на это правильно, пока я отвечал на это. –

+0

В тасовании мне не нужно заботиться о этикетках? – Kun

+0

Нет, он просто перемещает строки (индексы последовательности). Сама строка/контент не изменяется. –

0

Для этого нет прямого метода Python/api. Из того, что я понимаю, вы хотите перетасовать содержимое таким образом, чтобы совпадений (спаривания) не было сопоставлено с линией. Итак, вам нужно реализовать эту перетасовку. Поскольку я потратил довольно много времени на это и не хотел сдаваться - вот мой последний вопрос. Надеюсь, это поможет вам изменить его дальше, если это необходимо.

> cat ./disjoint.py 
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import random 
NUM_ITEMS = 10 

data = [] 
for i in range(NUM_ITEMS): 
    #data.append("data_%d" % (i if i%2 == 0 else i/2)) # for negative testing: create some duplicates 
    data.append("data_%d" % (i)) 

output = list(data) # copy 

def display(d, o): 
    print("%3s | %8s | %8s | %6s" % ("#", "Data", "Output", "Match?")) 
    len1 = len(d) 
    len2 = len(o) 
    lenb = max(len1, len2) 
    for i in range(lenb): 
     i1 = d[i] if i < len1 else "None1" 
     i2 = o[i] if i < len2 else "None2" 
     print("%3d | %8s | %8s | %6s" % (i, i1, str(i2), "Err" if not i2 else "Yes" if (i1 == i2) else "No")) 

print("==================== Input ==================") 
display(data, output) 

uniq = set(data) # list without duplicates. 
for i in range(NUM_ITEMS): 
    d = data[i] 

    tmp_uniq = set(uniq) # copy 
    if d in tmp_uniq: 
     tmp_uniq.remove(d) # exclude current paired item. 
    if len(tmp_uniq) == 0: 
     output[i] = None 
     continue 

    tmp_uniq = list(tmp_uniq) # shuffle works only on list 
    random.shuffle(tmp_uniq) # shuffle remaining non-matching items 
    a_non_matching = tmp_uniq[0] 
    output[i] = a_non_matching 
    uniq.remove(a_non_matching) 

print("==================== Output ==================") 
display(data, output) 

И вот выход из этого нового кода тест/образец:

> ./disjoint.py 
==================== Input ================== 
    # |  Data | Output | Match? 
    0 | data_0 | data_0 | Yes 
    1 | data_1 | data_1 | Yes 
    2 | data_2 | data_2 | Yes 
    3 | data_3 | data_3 | Yes 
    4 | data_4 | data_4 | Yes 
    5 | data_5 | data_5 | Yes 
    6 | data_6 | data_6 | Yes 
    7 | data_7 | data_7 | Yes 
    8 | data_8 | data_8 | Yes 
    9 | data_9 | data_9 | Yes 
==================== Output ================== 
    # |  Data | Output | Match? 
    0 | data_0 | data_5 |  No 
    1 | data_1 | data_2 |  No 
    2 | data_2 | data_0 |  No 
    3 | data_3 | data_1 |  No 
    4 | data_4 | data_6 |  No 
    5 | data_5 | data_9 |  No 
    6 | data_6 | data_7 |  No 
    7 | data_7 | data_8 |  No 
    8 | data_8 | data_4 |  No 
    9 | data_9 | data_3 |  No 
+0

Я очень ценю ваше время, я работаю над этим, используя Pandas. Я попробую ваш метод позже – Kun

+0

Хорошо, круто. Если выше ответ помог вам, можете ли вы его продвинуть? –

+0

Определенно. Я хочу найти способ обсудить это с вами. Вы знаете, как использовать дискуссию? – Kun