如何在 Pandas 中按年和月加入 2 个数据框?

Posted

技术标签:

【中文标题】如何在 Pandas 中按年和月加入 2 个数据框?【英文标题】:How to join 2 dataframe on year and month in Pandas? 【发布时间】: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 强大的日期时间工具,我认为没有必要从日期时间中提取组件。 【参考方案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

【讨论】:

以上是关于如何在 Pandas 中按年和月加入 2 个数据框?的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中按年和月聚合查询

我需要从结构为 yyyyMMddHHmmss 20170227141500 的时间戳中按年和月分组

如何使用 Flume 按年和月对 txt/csv 文件中的数据进行分区?是不是可以使 HDFS 路径动态化?

如何使用 CouchDB 按年和月对条目进行分组?

如何在 Pandas 数据框中按列值分组

按年和月分组并获得一个月的最小值,日期