簡體   English   中英

熊貓-用特定組的平均值替換列中的NaN

[英]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()))

來源2

這兩個都不能完全滿足我的需求。 如果有人可以指導我,將不勝感激!

您可以通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM