我有以下資料框:
df = pd.DataFrame([[np.nan, 2, 20, 4],
[3, 1, np.nan, 1],
[3, 1, 15, 1],
[np.nan, 1, np.nan, 1],
[10, 1, 30, 4],
[50, 2, 35, 4],
[10, 1, 37, 4],
[40, 2, 30, 1]],
columns=list("ABCD"))
我想用他們的組平均值填充 Nan 值。為此,我運行以下命令:
df_mean=df.groupby(["B","D"]).mean()
df_mean
A C
B D
1 1 3.0 15.0
4 10.0 33.5
2 1 40.0 30.0
4 50.0 27.5
有沒有辦法用 df_mean 中計算的值填充資料框 df?
一種方法是在這個答案中
df[["A", "C"]] = (
df
# create groups
.groupby(["B", "D"])
# transform the groups by filling na values with the group mean
.transform(lambda x: x.fillna(x.mean()))
)
但是,對于幾百萬行,簡單的 groupby([...]).mean() 需要幾秒鐘,需要太長時間......
有更快的方法來解決這個問題嗎?
uj5u.com熱心網友回復:
使用GroupBy.transformbymean并傳遞給DataFrame.fillna:
df = df.fillna(df.groupby(["B", "D"]).transform('mean'))
print (df)
A B C D
0 50.0 2 20.0 4
1 3.0 1 15.0 1
2 3.0 1 15.0 1
3 3.0 1 15.0 1
4 10.0 1 30.0 4
5 50.0 2 35.0 4
6 10.0 1 37.0 4
7 40.0 2 30.0 1
您的聚合解決方案也可以使用這種方式:
df = df.fillna(df[['B','D']].join(df.groupby(["B","D"]).mean(), on=['B','D']))
print (df)
A B C D
0 50.0 2 20.0 4
1 3.0 1 15.0 1
2 3.0 1 15.0 1
3 3.0 1 15.0 1
4 10.0 1 30.0 4
5 50.0 2 35.0 4
6 10.0 1 37.0 4
7 40.0 2 30.0 1
uj5u.com熱心網友回復:
您可以使用combine_first:
out = df.combine_first(df.groupby(['B', 'D']).transform('mean'))
print(out)
# Output
A B C D
0 50.0 2 20.0 4
1 3.0 1 15.0 1
2 3.0 1 15.0 1
3 3.0 1 15.0 1
4 10.0 1 30.0 4
5 50.0 2 35.0 4
6 10.0 1 37.0 4
7 40.0 2 30.0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409848.html
標籤:
上一篇:PandasDF到嵌套串列
下一篇:根據資料框中另一列的值創建新列
