如何在 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 个数据框?的主要内容,如果未能解决你的问题,请参考以下文章
我需要从结构为 yyyyMMddHHmmss 20170227141500 的时间戳中按年和月分组