首页 > 解决方案 > 如何用特定时间值的平均值填充 Nan 值?

问题描述

我有一个数据集,其中包含一个月的每分钟数据。但是有很多价值是缺失的。我的数据集如下所示:

    Date                  Col1          Col2
2018-06-01 08:01:00        Nan            Nan
2018-06-01 08:02:00        14             24
2018-06-01 08:03:00        17             18
2018-06-01 08:04:00        Nan            Nan  
...........
...........
...........
...........
2018-06-30 23:57:00         12             13 
2018-06-30 23:58:00         Nan            Nan  
2018-06-30 23:59:00         18             22

整个数据集中每分钟将有30 个值。所以,我想用那一分钟的平均值填充缺失的值。我想每分钟都这样做。

例如:

    Date                  Col1          Col2
2018-06-01 08:01:00        Nan            Nan
2018-06-02 08:01:00        14             21
2018-06-03 08:01:00        16             28
2018-06-04 08:01:00        Nan            Nan  
...........
...........
...........
...........
2018-06-28 08:01:00         12             19 
2018-06-29 08:01:00         Nan            Nan  
2018-06-30 08:01:00         17             22

所以,为了首先得到所有的值08:01:00,我做df.at_time('08:01:00')了上面的示例表。但是那如何填补那个时候的缺失值​​呢?如果我这样做df.fillna(df.at_time('08:01:00').mean()),它会用 at 的平均值填充整个数据集的所有缺失值08:01:00,但我只想用值08:01:00的平均值填充at 的缺失08:01:00值。我希望每一分钟都这样做。

任何帮助,将不胜感激!

编辑:

您可以通过以下代码创建数据框,也可以创建自己的随机示例

df = pd.DataFrame({'Col1': [1,5,6,Nan,Nan,Nan]}, index= ['2018-06-01 08:00:00','2018-06-01 08:01:00','2018-06-02 08:01:00','2018-06-03 08:01:00', '2018-06-04 08:01:00','2018-06-02 08:00:00'])

标签: pythonpandas

解决方案


我认为您需要GroupBy.transform按以下方式time替换缺失值fillna

print (df)
                 Date  Col1  Col2
0 2018-06-01 08:01:00   NaN   NaN
1 2018-06-02 08:01:00  14.0  24.0 <-change datetime
2 2018-06-03 08:01:00  17.0  18.0 <-change datetime
3 2018-06-01 08:04:00   NaN   NaN
4 2018-06-30 23:57:00  12.0  13.0
5 2018-06-30 23:58:00   NaN   NaN
6 2018-06-30 23:59:00  18.0  22.0

cols = ['Col1','Col2']
df[cols] = df[cols].fillna(df.groupby(df['Date'].dt.time)[cols].transform('mean'))

或者使用自定义 lambda 函数:

cols = ['Col1','Col2']
df[cols] = df.groupby(df['Date'].dt.time)[cols].transform(lambda x: x.fillna(x.mean()))

print (df)
                 Date  Col1  Col2
0 2018-06-01 08:01:00  15.5  21.0
1 2018-06-02 08:01:00  14.0  24.0
2 2018-06-03 08:01:00  17.0  18.0
3 2018-06-01 08:04:00   NaN   NaN
4 2018-06-30 23:57:00  12.0  13.0
5 2018-06-30 23:58:00   NaN   NaN
6 2018-06-30 23:59:00  18.0  22.0

推荐阅读