Ich habe ein Wörterbuch mit einer unbekannten Anzahl von Pandas Datenrahmen. Jeder Datenrahmen enthält eine Reihe von Spalten, die immer vorhanden sind (user_id) und eine Reihe von Spalten, die möglicherweise vorhanden sind oder nicht. Alle Datenrahmen haben die gleiche Anzahl und Reihenfolge der Zeilen. Der Inhalt jeder Zelle ist eine Liste (für die Spalten, die mich interessieren).Mehrere Pandas-Datenrahmen zu einem einzigen Datenrahmen verschmelzen mit Inhalt als Liste verkettet
Ein vereinfachtes Beispiel:
df['first'] = pd.DataFrame( {'user_ID': [1, 2, 3],
'col1': [[1], [2,3], [3]],
'col2': [[3], [3], [3,1]],
'col3': [[], [1,2,3], [3,1]]})
df['second'] = pd.DataFrame( {'user_ID': [1, 2, 3],
'col1': [[1, 2], [3], [3]],
'col3': [[1], [2,3], [3]],
'col4': [[3], [3], [3,1]] })
df['last'] = pd.DataFrame( {'user_ID': [1, 2, 3],
'col1': [[1], [2,3], [3]],
'col2': [[3], [3], [3,1]],
'col5': [[], [1,2,3], [3,1]]})
Sie sehen aus wie:
col1 col2 col3 user_ID
0 [1] [3] [] 1
1 [2, 3] [3] [1, 2, 3] 2
2 [3] [3, 1] [3, 1] 3
col1 col3 col4 user_ID
0 [1, 2] [1] [3] 1
1 [3] [2, 3] [3] 2
2 [3] [3] [3, 1] 3
col1 col2 col5 user_ID
0 [1] [3] [] 1
1 [2, 3] [3] [1, 2, 3] 2
2 [3] [3, 1] [3, 1] 3
Wie kann ich alle verschmelzen diese Datenrahmen in einem einzigen Datenrahmen, in der alle Spalten, die nicht benutzer_ID zusammengeführt werden, so der Inhalt an die Liste angehängt?
Ergebnis aussehen soll (die Reihenfolge der Elemente in jeder Liste ist irrelevant):
col1 col2 col3 col4 col5 user_ID
0 [1, 1, 2, 1] [3, 3] [1] [3] [] 1
1 [2, 3, 3, 2, 3] [3, 3] [1, 2, 3, 2, 3] [2] [1, 2, 3] 2
2 [3, 3, 3] [3, 1, 3, 1] [3, 1, 3] [3, 1] [3, 1] 3
ich den Datenrahmen verketten geschaffen, aber ich muß noch die resultierenden Spalten verschmelzen.
for dfName in ['first', 'second', 'last']:
df[dfName] = df[dfName].drop(['user_ID'], axis=1)
merged = pd.concat(df, axis=1, keys=['first', 'second', 'last'])
print(merged)
Ausgänge:
first second last \
col1 col2 col3 col1 col3 col4 col1 col2
0 [1] [3] [] [1, 2] [1] [3] [1] [3]
1 [2, 3] [3] [1, 2, 3] [3] [2, 3] [3] [2, 3] [3]
2 [3] [3, 1] [3, 1] [3] [3] [3, 1] [3] [3, 1]
col5
0 []
1 [1, 2, 3]
2 [3, 1]
Irgendwelche Ideen?
netter Trick Vergleich 'NaN' zu' NaN'. Ich habe das vergessen. Ich denke, Sie müssen nicht nach Achse 1 concat und dann transponieren. Sie können einfach concat und dann groupby 'user_ID' –
@ MaartenFabré Works gut, danke für die Eingabe! –
Ich habe eine kleine Änderung vorgenommen, um mit der Tatsache umzugehen, dass ich nicht weiß, wie viele Datenfelder ich im Dict habe: 'merged = pd.concat (df, Achse = 0, keys = list (df.keys())) .applymap (Lambda x: [] wenn x! = x sonst x) .groupby ('user_ID', as_index = Falsch) .sum() ' Und voila! – fuyas