2016-04-30 8 views
1

Ich habe eine CSV-Datei in der folgenden Form.Lesen einer CSV-Datei in Pandas mit einer Spalte ist wie eine Liste, neue Zeilen erstellen

id results_numbers results             creation_time 
9680 2   [(9394, u'lesbyfaye'), (999, u'Kayts & Koilsby')]  11/10/14 0:23 
9690 3   [(5968, u'Jacobsonl'), (47, u'SarHix'), (8825, u'joy')] 12/10/14 0:10 

und ich möchte dies in Pandas lesen und verdeckte die folgenden:

id  results_numbers new_id name    creation_time 
9680 2    9394 lesbyfaye   11/10/14 0:23 
9680 3    999 Kayts & Koilsby 11/10/14 0:23 
9690 3    5968 Jacobsonl   12/10/14 0:10 
9690 3     47 SarHix   12/10/14 0:10 
9690 3    8825 joy    12/10/14 0:10 

Antwort

1

vorausgesetzt, Sie die Datenrahmen lesen:

df = pd.DataFrame({'id': [9680, 9690], 'results_number': [2, 3], 'results': [[(9394, u'lesbyfaye'), (999, u'Kayts & Koilsby')], [(5968, u'Jacobsonl'), (47, u'SarHix'), (8825, u'joy')]], 'creation_time': ["11/10/14 0:23", "12/10/14 0:10"]}) 

>>>> pd.DataFrame([[row.id, row.results_number, tup[0], tup[1], row.creation_time] 
        for _, row in df.iterrows() 
        for tup in row.results], 
        columns=['id', 'results_numbers', 'new_id', 'name', 'creation_time']) 

    id results_numbers new_id    name creation_time 
0 9680    2 9394  lesbyfaye 11/10/14 0:23 
1 9680    2  999 Kayts & Koilsby 11/10/14 0:23 
2 9690    3 5968  Jacobsonl 12/10/14 0:10 
3 9690    3  47   SarHix 12/10/14 0:10 
4 9690    3 8825    joy 12/10/14 0:10 

EDIT

Wenn Sie fehlerhafte Daten haben, versuchen Sie Folgendes:

good_data = [] 
bad_data = [] 
for _, row in df.iterrows(): 
    for n, tup in enumerate(row.results): 
     if len(tup) == 2: 
      good_data.append([row.id, row.results_number, tup[0], tup[1], row.creation_time]) 
     else: 
      bad_data.append(n, tup) 
+0

Alexander, danke. Dies funktioniert für den Datensatz in der Frage. Allerdings, wenn ich dies auf meine gesamte Datenmenge anwenden, habe ich das: IndexError: string Index außerhalb des Bereichs – user35577

+0

@ user35577 Siehe bearbeiten oben – Alexander

+0

ok, Ihre erste Lösung funktioniert gut, wenn die Daten ordnungsgemäß formatiert sind. Aber ich finde heraus, dass die "Ergebnisse" bei 512 Zeichen abgeschnitten sind. Wegen der Kürzung kann ich diese Art von "Ergebnissen" am Ende haben: [(47, uSarHix '), (8825, u'joy'), .........., (6582 , u'tevez '), (135, u'tr – user35577

0

Sie können es versuchen, tun auch ohne Looping:

Original-DF:

In [184]: df 
Out[184]: 
    creation_time id           results \ 
0 11/10/14 0:23 9680  [(9394, lesbyfaye), (999, Kayts & Koilsby)] 
1 12/10/14 0:10 9690 [(5968, Jacobsonl), (47, SarHix), (8825, joy)] 

    results_number 
0    2 
1    3 

Lösung:

In [189]: tmp = (pd.DataFrame.from_dict(df.results.to_dict(), orient='index') 
    .....:   .stack() 
    .....:   .reset_index(level=1, drop=True) 
    .....:  ) 

In [190]: idx = tmp.index 

In [191]: new = (pd.DataFrame(tmp.tolist(), columns=['new_id','name'], index=idx) 
    .....:   .join(df.drop(['results'], axis=1)) 
    .....:  ) 

Ergebnis:

In [192]: new 
Out[192]: 
    new_id    name creation_time id results_number 
0 9394  lesbyfaye 11/10/14 0:23 9680    2 
0  999 Kayts & Koilsby 11/10/14 0:23 9680    2 
1 5968  Jacobsonl 12/10/14 0:10 9690    3 
1  47   SarHix 12/10/14 0:10 9690    3 
1 8825    joy 12/10/14 0:10 9690    3