【问题标题】:Merge hour_index dataframe with day_index dataframe and fill all rows with same value from day_index dataframe将 hour_index 数据帧与 day_index 数据帧合并,并使用 day_index 数据帧中的相同值填充所有行
【发布时间】:2019-10-11 15:56:16
【问题描述】:

我目前有两个数据框,一个索引在 hour,另一个索引在 day.

df1
                      col1    col2   col3
datetime
2018-03-01 10:00       1        2      3
2018-03-01 11:00       1        2      3 
2018-03-01 12:00       1        2      3


df2
                col4      col5
datetime
2018-03-01       10        20 
2018-03-02       10        20 
2018-03-03       10        20

我想合并这两个数据框,以便我可以将来自 col4col5 的值添加到 df1 上,但是 df1 上的所有行都填充有来自 df2 的相应值,而不仅仅是单行每天。

如果我在下面这样做:

df_merge=pd.merge(df1,df2, how='outer', left_index=True, right_index=True)

我明白了:

    df1
                      col1    col2   col3   col4   col5
datetime
2018-03-01 10:00       1        2      3     10      20
2018-03-01 11:00       1        2      3     NaN     NaN
2018-03-01 12:00       1        2      3     NaN     NaN...

有没有办法让我也用1020 填充NaN?所以2018-03-01 上的所有时间都应该用相同的值填充col4col5...

谢谢

【问题讨论】:

    标签: pandas dataframe datetime merge


    【解决方案1】:

    您可以使用Series.dt.floor 并通过它与left_on 合并:

    a = df1.index.floor('d')
    df_merge=pd.merge(df1,df2, how='outer', left_on=a, right_index=True)
    print (df_merge)
                             key_0  col1  col2  col3  col4  col5
    datetime                                                    
    2018-03-01 10:00:00 2018-03-01   1.0   2.0   3.0    10    20
    2018-03-01 11:00:00 2018-03-01   1.0   2.0   3.0    10    20
    2018-03-01 12:00:00 2018-03-01   1.0   2.0   3.0    10    20
    2018-03-01 12:00:00 2018-03-02   NaN   NaN   NaN    10    20
    2018-03-01 12:00:00 2018-03-03   NaN   NaN   NaN    10    20
    

    如有必要,删除由日期时间填充的列:

    a = df1.index.floor('d')
    df_merge=pd.merge(df1,df2, how='outer', left_on=a, right_index=True).drop('key_0', 1)
    print (df_merge)
                         col1  col2  col3  col4  col5
    datetime                                         
    2018-03-01 10:00:00   1.0   2.0   3.0    10    20
    2018-03-01 11:00:00   1.0   2.0   3.0    10    20
    2018-03-01 12:00:00   1.0   2.0   3.0    10    20
    2018-03-01 12:00:00   NaN   NaN   NaN    10    20
    2018-03-01 12:00:00   NaN   NaN   NaN    10    20
    

    这里似乎还需要左连接:

    a = df1.index.floor('d')
    df_merge=pd.merge(df1,df2, how='left', left_on=a, right_index=True)
    print (df_merge)
    
                         col1  col2  col3  col4  col5
    datetime                                         
    2018-03-01 10:00:00     1     2     3    10    20
    2018-03-01 11:00:00     1     2     3    10    20
    2018-03-01 12:00:00     1     2     3    10    20
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2017-08-16
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多