我正在尝试使用具有相似列值的行来估算值。
例如,我有这个数据框
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()
感谢您的时间。
如果每个组仅使用一个非NaN的值ffill(前向填充)和bfill每组(向后填充),所以需要apply有lambda:
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按组:
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