2016-10-25 3 views
-2

Angenommen, ich habe zwei CSV-Dateien, jeder von ihnen hat 100 Zeilen. Jede Zeile in zwei CSV-Dateien hat den gleichen Index und das gleiche Label. Daher können diese 100 Zeilen als Paardatensatz angezeigt werden.Mischen CSV-Datei Daten nach ihren Etiketten

Mein Zweck ist es, eine der CSV-Dateien zu mischen, um die Daten je nach ihren unterschiedlichen Labels ungepaart zu machen.

Zum Beispiel input:

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

Output:

data_1    data_2'  
...     ... 

Weil Data_1 und Data_2' unterschiedliche Etiketten (12 bzw. 6), so werden sie als als ungepaarte Daten. Mein Zweck ist es, eine beliebige Anzahl von Daten auszuwählen, die mit data_1 unterschiedliche Bezeichnungen haben.

Gibt es irgendwelche Python-Bibliotheken oder Methoden, um es zu machen?

+0

Es 3 Schritten: die Daten lesen mit [csv] (https://docs.python.org/ 2/library/csv.html), mische die Daten mit [random] (https://docs.python.org/2/library/random.html), schreibe die Daten mit [csv] (https: // docs. python.org/2/library/csv.html) – zvone

+0

@zvone Wie kann man sicherstellen, dass die Daten mit verschiedenen Labels nicht verknüpft sind? – Kun

+0

Wenn Sie es mischen, wird es ungepaart. Die Chance auf 100 Zeilen nach dem Mischen ist 1 bis 9,33e + 157 – zvone

Antwort

0

Sie können den csv-Inhalt mischen, indem Sie die Funktion random.shuffle() von python verwenden. Hier ist ein Beispiel/Test-Code in 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

Ich habe nicht bemerkt, dass jemand das schon richtig beantwortet hat, während ich das beantwortet habe. –

+0

In Shuffle muss ich mich nicht um die Labels kümmern? – Kun

+0

Nein, es mischt nur die Zeilen (Sequenzindizes). Die Zeile/der Inhalt selbst ist nicht modifiziert. –

0

Es gibt keine direkten Python-Methode/api es zu tun. Von dem, was ich verstehe, möchten Sie den Inhalt so mischen, dass es keine Übereinstimmungen (Paarung) gibt, wenn Zeile für Zeile verglichen wird. Also müssen Sie dieses Shuffling implementieren. Da ich viel Zeit damit verbracht habe und nicht aufgeben wollte - hier ist mein letzter Versuch. Hoffe es hilft dir, es bei Bedarf weiter zu modifizieren.

> 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) 

Und hier ist die Ausgabe von diesem neuen Test/Beispielcode:

> ./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

Ich schätze deine Zeit sehr, ich habe daran mit Pandas gearbeitet. Ich werde versuchen, Ihre Methode später – Kun

+0

Ok, cool. Wenn die obige Antwort Ihnen geholfen hat, können Sie sie verbessern? –

+0

Definitiv. Ich möchte einen Weg finden, das mit dir zu besprechen. Weißt du, wie man die Diskussion benutzt? – Kun

Verwandte Themen