我有一个非常大的熊猫数据集,其中的数据看起来像如何加快替换Pandas中每个groupby组的缺失值?
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'])
组中,如果该值存在,则使用该唯一的非缺失值(在该组中)替换所有缺少的值。
为此,我使用groupby
之后可用的first
函数,它传播为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
)...有什么想法?
UPDATE下面ajcr
提出的非常有效的解决方案是否适用于由几列定义的组?在这种情况下,map
不起作用。也许merge
?
。让我试试这个解决方案 –
你能解释一下在这里做的“map”吗? –
我玩的是类似'a [['B','C']] = a.apply(lambda x:g.loc [x.group,['B','C']],axis = 1)',但速度要慢得多。因此,为您的解决方案+1投票 – MaxU