Ich habe einen sehr großen Pandas-Datensatz, in dem die Daten aussehenWie beschleunigt man das Ersetzen von fehlenden Werten für jede Gruppe durch Gruppen in Pandas?
df = pd.DataFrame({'group1' : ['A', 'A', 'A', 'A',
'B', 'B', 'B', 'B'],
'group2' : ['C', 'C', 'C', 'D',
'E', 'E', 'F', 'F'],
'B' : ['one', np.NaN, np.NaN, np.NaN,
np.NaN, 'two', np.NaN, np.NaN],
'C' : [np.NaN, 1, np.NaN, np.NaN,
np.NaN, np.NaN, np.NaN, 4]})
df
Out[64]:
B C group1 group2
0 one NaN A C
1 NaN 1 A C
2 NaN NaN A C
3 NaN NaN A D
4 NaN NaN B E
5 two NaN B E
6 NaN NaN B F
7 NaN 4 B F
Hier können Sie sehen, dass, für jede einzelne Kombination von group1
und group2
, die Spalten B
und C
enthält höchstens eine nicht-fehlende Variable .
Innerhalb jeder groupby(['group1','group2'])
Gruppe ersetze ich alle fehlenden Werte, indem ich diesen eindeutigen, nicht fehlenden Wert (in dieser Gruppe) verwende, wenn dieser Wert existiert.
dies zu tun, verwende ich die first
Funktion verfügbar, nachdem ein groupby
, die den ersten nichtfehlender Wert für B oder C in jeder Gruppe der fehlenden Werte in der Gruppe an den Rest ausbreitet:
df[['B','C']]=df.groupby(['group1','group2']).transform('first')
df
Out[62]:
B C group1 group2
0 one 1 A C
1 one 1 A C
2 one 1 A C
3 NaN NaN A D
4 two NaN B E
5 two NaN B E
6 NaN 4 B F
7 NaN 4 B F
Leider ist dies schmerzhaft langsam auf meinem sehr großen Datensatz. Siehst du irgendeinen Weg, die Geschwindigkeit hier zu verbessern? Ich dachte an fillna
, aber es scheint, ich würde es zweimal anwenden müssen (ffill
und bfill
) ... Irgendwelche Ideen?
UPDATE Würde die von ajcr
vorgeschlagene sehr effiziente Lösung mit Gruppen arbeiten, die durch mehrere Spalten definiert sind? map
funktioniert in diesem Fall nicht. Vielleicht merge
?
Genie finden. Lemme versuchen Sie diese Lösung –
können Sie erklären, was ist die 'map' hier tun? –
Ich spielte mit etwas ähnlich wie a [['B', 'C']] = a.apply (lambda x: g.loc [x.gruppe, ['B', 'C']], axis = 1) ', aber es war viel langsamer. So +1 für Ihre Lösung – MaxU