[英]Pandas - Replace NaNs in a column with the mean of specific group
我正在處理如下數據。 數據框按日期排序:
category value Date
0 1 24/5/2019
1 NaN 24/5/2019
1 1 26/5/2019
2 2 1/6/2019
1 2 23/7/2019
2 NaN 18/8/2019
2 3 20/8/2019
7 3 1/9/2019
1 NaN 12/9/2019
2 NaN 13/9/2019
我想用該特定類別的先前均值替換“ NaN”值。
在熊貓中做到這一點的最佳方法是什么?
我考慮過一些方法:
1)此小段即興演奏:
df['mean' = df.groupby('category')['time'].apply(lambda x: x.shift().expanding().mean()))
這在另一列中為我提供了正確的方法,並且不能代替NaN。
2)此即興重復數用列的平均值替換NaN:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
這兩個都不能完全滿足我的需求。 如果有人可以指導我,將不勝感激!
您可以通過shift
+ expanding
+ mean
用新Series替換value
,因為不存在以前的NaN
值,所以不會替換1
組的第一個值:
df['Date'] = pd.to_datetime(df['Date'])
s = df.groupby('category')['value'].apply(lambda x: x.shift().expanding().mean())
df['value'] = df['value'].fillna(s)
print (df)
category value Date
0 0 1.0 2019-05-24
1 1 NaN 2019-05-24
2 1 1.0 2019-05-26
3 2 2.0 2019-01-06
4 1 2.0 2019-07-23
5 2 2.0 2019-08-18
6 2 3.0 2019-08-20
7 7 3.0 2019-01-09
8 1 1.5 2019-12-09
9 2 2.5 2019-09-13
您可以使用pandas.Series.fillna替換NaN值:
df['value']=df['value'].fillna(df.groupby('category')['value'].transform(lambda x: x.shift().expanding().mean()))
print(df)
category value Date
0 0 1.0 24/5/2019
1 1 NaN 24/5/2019
2 1 1.0 26/5/2019
3 2 2.0 1/6/2019
4 1 2.0 23/7/2019
5 2 2.0 18/8/2019
6 2 3.0 20/8/2019
7 7 3.0 1/9/2019
8 1 1.5 12/9/2019
9 2 2.5 13/9/2019
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.