【问题标题】:Time Series: Fill NaNs from another dataframe时间序列:从另一个数据框中填充 NaN
【发布时间】:2021-08-11 01:13:37
【问题描述】:

我正在处理温度数据,我创建了一个包含几千个城市多年平均值的文件,格式如下(df1)

Date    City    PRCP    TMAX    TMIN    TAVG
01-Jan  Zurich  0.94    3.54    0.36    1.95
01-Feb  Zurich  4.12    9.14    3.04    6.09
01-Mar  Zurich  4.1     5.9     0.3     3.1
01-Apr  Zurich  0.32    13.78   4.22    9
01-May  Zurich  9.42    11.32   5.34    8.33
.
.
.....

我有所有 365 天的上述数据,没有空值。请注意,date 列只有 daymonth,因为年份无关紧要。

基于上述数据,我正在尝试清理年度文件,我的第二个数据帧具有以下格式的数据(df2)

ID      Date        City    PRCP    TAVG    TMAX    TMIN
abcd1   2020-01-01  Zurich  0       -1.9    -0.9    
abcd1   2020-01-02  Zurich  9.1             12.7    4.9
abcd1   2020-01-03  Zurich  0.8      8.55   13.2    3.9
abcd1   2020-01-04  Zurich  0        4.1    10.8    -2.6

.
.
.....

每个城市都有一个独特的ID。日期列的格式为%y-%m-%d

我正在尝试通过匹配daymonth 将第二个数据帧中的空值替换为我的第一个数据帧中的值。这是我尝试过的

df1["Date"] = pd.to_datetime(df1["Date"], errors = 'coerce')   ##date format change##
df1["Date"] = df1['Date'].dt.strftime('%d-%m')
df2 = df2.drop(columns='ID')

df2 = df2.fillna(df1)         ##To replace nulls##

df1["Date"] = pd.to_datetime(df1["Date"], errors = 'coerce')
df1["Date"] = df1['Date'].dt.strftime('%Y-%m-%d')      ## Change data back to original format##

即使这样,我的年度文件中也会出现空值,即df2{注意:df1 没有空值}

如有必要,请建议一种更好的方法来仅替换空值或对代码进行任何更正。

【问题讨论】:

  • 如果我错了,请纠正我,但 df1 没有空值,所以您的意思是 df2 = df1.fillna(df2) ?
  • 与让 Pandas 吐出你想要的 NaN 无关,但与“有没有更好的方法来替换空值”的问题有关,你可能想看看 Sklearn。他们有一些用于估算缺失值的内置工具:scikit-learn.org/stable/modules/impute.html
  • @HenryEcker 是的,我就是这个意思,抱歉打错了
  • 如果需要进一步澄清答案,请告诉我!

标签: python pandas dataframe time-series temperature


【解决方案1】:

我们可以通过在df2 上添加一列Date2 来实现,其格式与df1 上的Date 列相同。然后,在使用这种日期格式和城市作为索引设置两个数据框的同时,我们使用.update() 对 df2 执行更新,如下所示:

df2["Date2"] = pd.to_datetime(df2["Date"], errors = 'coerce').dt.strftime('%d-%b')          #  dd-MMM (e.g. 01-JAN)

df2a = df2.set_index(['Date2', 'City'])        # Create df2a from df2 with set index on Date2 and City

df2a.update(df1.set_index(['Date', 'City']), overwrite=False)   # update only NaN values of df2a by corresponding values of df1

df2 = df2a.reset_index(level=1).reset_index(drop=True)    # result put back to df2 throwing away the temp `Date2` row index

df2.insert(2, 'City', df2.pop('City'))    # relocate column City back to its original position

.update() 是使用来自另一个 DataFrame 的非 NA 值进行就地修改。 DataFrame 的长度不会因为更新而增加,只会更新匹配索引/列标签处的值。因此,我们使两个数据框都具有相同的行索引,以便对具有相同列索引/标签的相应列执行更新。

请注意,我们在.update() 中使用参数overwrite=False 以确保我们只更新原始DataFrame df2 中的NaN 值。

演示

数据设置:

将数据添加到 df1 以展示从 df1 替换 df2 的值:

print(df1)

     Date    City  PRCP   TMAX  TMIN  TAVG
0  01-Jan  Zurich  0.94   3.54  0.36  1.95
1  02-Jan  Zurich  0.95   3.55  0.37  1.96       <=== Added this row
2  01-Feb  Zurich  4.12   9.14  3.04  6.09
3  01-Mar  Zurich  4.10   5.90  0.30  3.10
4  01-Apr  Zurich  0.32  13.78  4.22  9.00
5  01-May  Zurich  9.42  11.32  5.34  8.33

print(df2)       #  before processing

      ID        Date    City  PRCP  TAVG  TMAX  TMIN
0  abcd1  2020-01-01  Zurich   0.0 -1.90  -0.9   NaN         <=== with NaN value
1  abcd1  2020-01-02  Zurich   9.1   NaN  12.7   4.9         <=== with NaN value
2  abcd1  2020-01-03  Zurich   0.8  8.55  13.2   3.9
3  abcd1  2020-01-04  Zurich   0.0  4.10  10.8  -2.6

运行新代码:

df2["Date2"] = pd.to_datetime(df2["Date"], errors = 'coerce').dt.strftime('%d-%b')          #  dd-MMM (e.g. 01-JAN)

df2a = df2.set_index(['Date2', 'City'])        # Create df2a from df2 with set index on Date2 and City

df2a.update(df1.set_index(['Date', 'City']), overwrite=False)   # update only NaN values of df2a by corresponding values of df1

df2 = df2a.reset_index(level=1).reset_index(drop=True)    # result put back to df2 throwing away the temp `Date2` row index

df2.insert(2, 'City', df2.pop('City'))    # relocate column City back to its original position

结果:

print(df2)


      ID       Date    City  PRCP  TAVG  TMAX  TMIN
0  abcd1 2020-01-01  Zurich   0.0 -1.90  -0.9  0.36     <== TMIN updated with df1 value
1  abcd1 2020-01-02  Zurich   9.1  1.96  12.7  4.90     <== TAVG updated with df1 value
2  abcd1 2020-01-03  Zurich   0.8  8.55  13.2  3.90
3  abcd1 2020-01-04  Zurich   0.0  4.10  10.8 -2.60

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2021-01-24
    • 2020-10-08
    • 2021-10-27
    • 1970-01-01
    • 2019-09-16
    • 2022-01-07
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多