У меня есть очень большой панд набор данных, где данные выглядят какКак ускорить замену отсутствующих значений для каждой группы groupby в 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
Здесь вы можете увидеть, что для каждой уникальной комбинации group1
и group2
, столбцы B
и C
содержат более одного не-неопределенную переменную ,
В каждой группе groupby(['group1','group2'])
, я заменяю все недостающие значения, используя это уникальное не пропущенное значение (в этой группе), если это значение существует.
Для этого я использую функцию first
доступной после groupby
, которая распространяется первым-нонами недостающего значения для B или C в каждой группе к остальной части недостающих значений в этой группе:
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
К сожалению, это болезненно медленное на моем очень большом наборе данных. Вы видите какой-либо способ улучшить скорость здесь? Я думал о fillna
, но, похоже, мне нужно будет применять его дважды (ffill
и bfill
) ... Любые идеи?
ОБНОВЛЕНИЕ Возможно ли эффективное решение, предложенное ajcr
, работать с группами, определенными несколькими столбцами? map
в этом случае не работает. Может быть merge
?
гений. lemme попробуйте это решение –
вы можете просто объяснить, что здесь делает «карта»? –
Я играл с чем-то похожим на 'a [['B', 'C']] = a.apply (lambda x: g.loc [x.group, ['B', 'C']], axis = 1) ', но он был намного медленнее. Итак, +1 за ваше решение – MaxU