我正在尝试使用具有相似列值的行来进行值填充/插补。
例如,我有这个数据框:
one | two | three
1 1 10
1 1 nan
1 1 nan
1 2 nan
1 2 20
1 2 nan
1 3 nan
1 3 nan
我想使用列 one
和 two
的键值,如果列three
不是完全为NaN,则从具有相似键的行中填充现有值到列'3'的值。
这是我的预期结果:one | two | three
1 1 10
1 1 10
1 1 10
1 2 20
1 2 20
1 2 20
1 3 nan
1 3 nan
您可以看到键1和3没有包含任何值,因为现有值不存在。
我尝试使用groupby
+fillna()
:
df['three'] = df.groupby(['one','two'])['three'].fillna()
我尝试使用向前填充,但出现了错误。
我已经尝试了向前填充,但结果很奇怪。 它填充的是第二列而不是第一列。 我正在使用以下代码进行向前填充:
df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill()
apply
的原因是什么?我问这个问题是因为我尝试了直接使用ffill
和bfill
,并且它返回了正确的结果:df['three'] = df.groupby(['one', 'two'])['three'].ffill().bfill()
。 - Andy L.bfill
是从输出序列中的ffill
进行回填,而不是从groupby
进行回填。感谢您的答案。 - Andy L.df['three'] = df.groupby(['one','two'], sort=False)['three'].apply(lambda x: x.ffill().bfill())
应用于多个列three, four, five, etc
而不仅仅是three
,需要按one
和two
进行分组并填充缺失值? - ah boncols = ['three','four','five']
和df[cols] = df.groupby(['one','two'], sort=False)[cols].apply(lambda x: x.ffill().bfill())
。 - jezrael