У меня есть 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
Здесь рудиментарное, но эффективное решение:
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
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