我试图使用具有相似列值的行来估算值。
例如,我有这个数据框
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()
给了我一个错误。
我尝试了向前填充,这给了我相当奇怪的结果,它向前填充第2列。我正在使用此代码进行前向填充。
df['three'] = df.groupby(['one','two'], sort=False)['three'].ffill()
感谢您的时间。
答案 0 :(得分:13)
如果每个组中只有一个非NaN值使用ffill
(向前填充)和bfill
(向后填充),那么apply
需要lambda
:
df['three'] = df.groupby(['one','two'], sort=False)['three']
.apply(lambda x: x.ffill().bfill())
print (df)
one two three
0 1 1 10.0
1 1 1 10.0
2 1 1 10.0
3 1 2 20.0
4 1 2 20.0
5 1 2 20.0
6 1 3 NaN
7 1 3 NaN
但是,如果每个组有多个值并且需要将NaN
替换为某个常量 - 例如mean
按小组分组:
print (df)
one two three
0 1 1 10.0
1 1 1 40.0
2 1 1 NaN
3 1 2 NaN
4 1 2 20.0
5 1 2 NaN
6 1 3 NaN
7 1 3 NaN
df['three'] = df.groupby(['one','two'], sort=False)['three']
.apply(lambda x: x.fillna(x.mean()))
print (df)
one two three
0 1 1 10.0
1 1 1 40.0
2 1 1 25.0
3 1 2 20.0
4 1 2 20.0
5 1 2 20.0
6 1 3 NaN
7 1 3 NaN