Wie die meisten Pandas Probleme, ich denke, das Problem wurde bereits behandelt, aber ich kann keine direkte Antwort finden und ich mache mir auch Sorgen über die Leistung. Mein Dataset ist groß, also hoffe ich, die effizienteste Art zu finden.DataFrame transponieren von Liste
Das Problem Ich habe 2 Datenrahmen - dfA enthält eine Liste von IDs von dfB. Ich mag würde
zu- transponieren diese IDs als Spalten
- die IDs ersetzen mit einem Wert von dfb
- Zusammenbruch wiederholt Spalten nachgeschlagen und Aggregat mit Summe
Hier ist eine Illustration:
dfA
dfA = pd.DataFrame({'a_id':['0000001','0000002','0000003','0000004'],
'list_of_b_id':[['2','3','7'],[],['1','2','3','4'],['6','7']]
})
+------+--------------+
| a_id | list_of_b_id |
+------+--------------+
| 1 | [2, 3, 7] |
+------+--------------+
| 2 | [] |
+------+--------------+
| 3 | [1, 2, 3, 4] |
+------+--------------+
| 4 | [6, 7] |
+------+--------------+
dfb
dfB = pd.DataFrame({'b_id':['1','2','3','4','5','6','7'],
'replacement': ['Red','Red','Blue','Red','Green','Blue','Red']
})
+------+-------------+
| b_id | replacement |
+------+-------------+
| 1 | Red |
+------+-------------+
| 2 | Red |
+------+-------------+
| 3 | Blue |
+------+-------------+
| 4 | Red |
+------+-------------+
| 5 | Orange |
+------+-------------+
| 6 | Blue |
+------+-------------+
| 7 | Red |
+------+-------------+
Tor (Endergebnis) Hier ist, was ich bin der Hoffnung, auf, um schließlich zu bekommen, auf die effizienteste Art und Weise möglich.
In Wirklichkeit kann ich über 5M Obs sowohl in dfA und dfB, und ~ 50 eindeutige Werte für den Ersatz in dfB haben, was erklärt, warum ich dies auf dynamische Weise tun muss und nicht nur hart-Code.
+------+-----+------+
| a_id | Red | Blue |
+------+-----+------+
| 1 | 2 | 1 |
+------+-----+------+
| 2 | 0 | 0 |
+------+-----+------+
| 3 | 3 | 1 |
+------+-----+------+
| 4 | 1 | 1 |
+------+-----+------+
Bei einer Stichprobe von 50K-Datensätzen in dfA- und 5M-Datensätzen in dfB dauerte dies 0,67 Minuten! – Josh
Es ist eine gute Zeit, danke für die Annahme! – jezrael