Python 如何在熊猫中加入2个数据帧?

Python 如何在熊猫中加入2个数据帧?,python,pandas,date,dataframe,merge,Python,Pandas,Date,Dataframe,Merge,我有2个数据框,我希望在不创建额外列的情况下,根据从某个日期算起的月份和年份加入它们: 例如: df1: df2: 然后得到如下结果,即根据月份和年份进行合并 date_1 value_1 value_2 2017-1-15 20 30 2017-1-31 30 30 2016-2-15 20 这里有一个基本但有效的解决方案: res = pd.merge(df1.assign(grouper=df1['date_1'].dt.to_period('

我有2个数据框,我希望在不创建额外列的情况下,根据从某个日期算起的月份和年份加入它们:

例如:

df1:

df2:

然后得到如下结果,即根据月份和年份进行合并

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

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

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']]
map

以下是使用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

使用年-月创建合并键,然后合并您的日期列datetime数据类型?谢谢wen,solvedGiven pandas强大的日期时间工具,我认为永远都不需要从日期时间中提取组件。这在尝试合并多个源和脏数据时非常有效。伟大的小片段!
res = res[['date_1', 'value_1', 'value_2']]
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
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