【问题标题】:How to join 2 dataframe on year and month in Pandas?如何在 Pandas 中按年和月加入 2 个数据框?
【发布时间】:2019-01-30 05:11:32
【问题描述】:

我有 2 个数据框,我想从某个日期开始根据月份和年份加入它们,而不创建额外的列:

示例:

df1:

date_1      value_1
2017-1-15    20
2017-1-31    30
2016-2-15    20

df2:

date_2      value_2
2017-1-1    30

然后得到如下结果,即按月和年合并。

date_1      value_1 value_2
2017-1-15    20     30
2017-1-31    30     30
2016-2-15    20

【问题讨论】:

  • 使用年月创建合并键,然后合并
  • 您的日期列是日期时间数据类型吗?
  • 谢谢文,解决了
  • 鉴于 pandas 强大的日期时间工具,我认为没有必要从日期时间中提取组件。

标签: python pandas date dataframe merge


【解决方案1】:

这是一个基本但有效的解决方案:

res = pd.merge(df1.assign(grouper=df1['date_1'].dt.to_period('M')),
               df2.assign(grouper=df2['date_2'].dt.to_period('M')),
               how='left', on='grouper')

print(res)

      date_1  value_1 grouper     date_2  value_2
0 2017-01-15       20 2017-01 2017-01-01     30.0
1 2017-01-31       30 2017-01 2017-01-01     30.0
2 2016-02-15       20 2016-02        NaT      NaN

然后您可以删除不需要的列:

res = res[['date_1', 'value_1', 'value_2']]

【讨论】:

  • 这在尝试将多个源与脏数据合并时非常有效。伟大的小sn-p!
【解决方案2】:

map

mapping = dict(zip(df2.date_2.dt.to_period('M'), df2.value_2))
df1.assign(value_2=df1.date_1.dt.to_period('M').map(mapping))

      date_1  value_1  value_2
0 2017-01-15       20     30.0
1 2017-01-31       30     30.0
2 2016-02-15       20      NaN

【讨论】:

    【解决方案3】:

    这是使用 lambda 函数的另一种方式:

    pd.merge(df,df2, left_on=df['date_1'].apply(lambda x: (x.year, x.month)),
             right_on=df2['date_2'].apply(lambda y: (y.year, y.month)),
             how='outer')[['date_1','value_1','value_2']]
    
        date_1      value_1   value_2
    0   2017-01-15    20        30.0
    1   2017-01-31    30        30.0
    2   2016-02-15    20        NaN
    

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2020-10-10
      • 2021-05-12
      • 2020-05-23
      • 2021-10-16
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多