用替换数据填充缺失数据

Posted

技术标签:

【中文标题】用替换数据填充缺失数据【英文标题】:Infill missing data with replacement data 【发布时间】:2021-10-31 18:26:25 【问题描述】:

我有一个 5 列的每日粒度的时间序列数据框

            A  B  C  D  E 
31/08/2021  1  4  3  8  9
01/09/2021  8  9  3  1  0
.
.
.
13/09/2021 8 9 0 9 3

我有一张每月“正常”值的表格;

   A  B  C  D  E
1  8  3  3  3  1
2  4  5  6  4  6
3  6  4  6  4  2
.
.
.
12 4 6 6  6 4

基本上我使用的原始数据是混乱的,当数据丢失时,我需要一种方法用其各自的“正常”值填补任何空白。

因此,例如,如果 B 列中没有 2021 年 3 月 21 日的数据,它将填充“4”作为表中 3 月 B 的正常值。

真的很努力,所以非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

使用DataFrame.asfreq 添加缺失的日期时间,然后将缺失值替换为将日期时间转换为months,最后转换为原始日期时间:

df1.index = pd.to_datetime(df1.index, dayfirst=True)

df1 = df1.asfreq('d')
df1 = df1.set_index(df1.index.month).fillna(df2).set_index(df1.index)

为测试更改了样本数据:

print (df1)
            A  B  C  D  E
30/07/2021  1  4  3  8  9
01/09/2021  8  9  3  1  0
13/09/2021  8  9  0  9  3

print (df2)
   A  B  C  D  E
1  8  3  3  3  1
7  4  5  6  4  6
8  6  4  6  4  2
9  4  6  6  6  4
    
df1.index = pd.to_datetime(df1.index, dayfirst=True)

df1 = df1.asfreq('d')
df1 = df1.set_index(df1.index.month).fillna(df2).set_index(df1.index)

print (df1)
              A    B    C    D    E
2021-07-30  1.0  4.0  3.0  8.0  9.0
2021-07-31  4.0  5.0  6.0  4.0  6.0
2021-08-01  6.0  4.0  6.0  4.0  2.0
2021-08-02  6.0  4.0  6.0  4.0  2.0
2021-08-03  6.0  4.0  6.0  4.0  2.0
2021-08-04  6.0  4.0  6.0  4.0  2.0
2021-08-05  6.0  4.0  6.0  4.0  2.0
2021-08-06  6.0  4.0  6.0  4.0  2.0
2021-08-07  6.0  4.0  6.0  4.0  2.0
2021-08-08  6.0  4.0  6.0  4.0  2.0
2021-08-09  6.0  4.0  6.0  4.0  2.0
2021-08-10  6.0  4.0  6.0  4.0  2.0
2021-08-11  6.0  4.0  6.0  4.0  2.0
2021-08-12  6.0  4.0  6.0  4.0  2.0
2021-08-13  6.0  4.0  6.0  4.0  2.0
2021-08-14  6.0  4.0  6.0  4.0  2.0
2021-08-15  6.0  4.0  6.0  4.0  2.0
2021-08-16  6.0  4.0  6.0  4.0  2.0
2021-08-17  6.0  4.0  6.0  4.0  2.0
2021-08-18  6.0  4.0  6.0  4.0  2.0
2021-08-19  6.0  4.0  6.0  4.0  2.0
2021-08-20  6.0  4.0  6.0  4.0  2.0
2021-08-21  6.0  4.0  6.0  4.0  2.0
2021-08-22  6.0  4.0  6.0  4.0  2.0
2021-08-23  6.0  4.0  6.0  4.0  2.0
2021-08-24  6.0  4.0  6.0  4.0  2.0
2021-08-25  6.0  4.0  6.0  4.0  2.0
2021-08-26  6.0  4.0  6.0  4.0  2.0
2021-08-27  6.0  4.0  6.0  4.0  2.0
2021-08-28  6.0  4.0  6.0  4.0  2.0
2021-08-29  6.0  4.0  6.0  4.0  2.0
2021-08-30  6.0  4.0  6.0  4.0  2.0
2021-08-31  6.0  4.0  6.0  4.0  2.0
2021-09-01  8.0  9.0  3.0  1.0  0.0
2021-09-02  4.0  6.0  6.0  6.0  4.0
2021-09-03  4.0  6.0  6.0  6.0  4.0
2021-09-04  4.0  6.0  6.0  6.0  4.0
2021-09-05  4.0  6.0  6.0  6.0  4.0
2021-09-06  4.0  6.0  6.0  6.0  4.0
2021-09-07  4.0  6.0  6.0  6.0  4.0
2021-09-08  4.0  6.0  6.0  6.0  4.0
2021-09-09  4.0  6.0  6.0  6.0  4.0
2021-09-10  4.0  6.0  6.0  6.0  4.0
2021-09-11  4.0  6.0  6.0  6.0  4.0
2021-09-12  4.0  6.0  6.0  6.0  4.0
2021-09-13  8.0  9.0  0.0  9.0  3.0

【讨论】:

嗨@jezrael,很抱歉打扰你,但我正在尝试再次使用它,但略有不同,似乎让它工作。如果我想使用每日“正常/平均值”而不是每月值,这可能吗? 例如,我将有 5 年的数据.. 我想用特定日期的平均值填充任何 NaN... df2 = df.groupby(by=[df. index.month, df.index.day]).mean() 得到我的平均值.. 然后填充到 NaN 我正在努力索引。 @spcol - 尝试将df2 = df.groupby(by=[df.index.month, df.index.day]).mean() 更改为df2 = df.resample('MS').mean(),然后将df1 = df1.set_index(df1.index.month).fillna(df2).set_index(df1.index) 更改为df1 = df1.fillna(df2.asfreq('d', method='ffill'))【参考方案2】:

您可以使用pd.to_datetimefill_na 函数执行以下操作:

def get_month(date):
    date = pd.to_datetime(date)
    return date.month

daily_df.apply(axis=1,  lambda row: row.fill_na(monthly_df[get_month(row.index)]))

【讨论】:

以上是关于用替换数据填充缺失数据的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan使用pandas的fillna函数用经验固定值填充缺失值np.nan

R语言-均值填充缺失值

用缺失日期的数据填充表格(postgresql、redshift)

Netezza SQL:用最近的数据填充缺失值

用分布填充缺失值

pandas(12):数据清洗(缺失值)