Как объединить 2 датафрейма по году и месяцу в Пандах?

1

У меня есть 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
  • 2
    Создайте ключ объединения, используя год-месяц, затем объедините
  • 0
    Ваши столбцы даты datetime dtypes?
Показать ещё 2 комментария
Теги:
pandas
dataframe
date
merge

3 ответа

4
Лучший ответ

Здесь рудиментарное, но эффективное решение:

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

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
0

Вот еще один способ использования лямбда-функций:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню