Как объединить 2 датафрейма на основе некоторой логики

1

У меня есть dataframe с ниже двухнедельными данными

date            value
15-06-2012      20
30-06-2012      30

И мне нужно объединиться с другим фреймворком данных, который имеет данные ниже:

   date            cost
    2-05-2011       5
    3-04-2012       80
    2-06-2012       10
    3-06-2012       10
    4-06-2012       30
    5-06-2012       20
    10-06-2012      10
    15-06-2012      10
    18-06-2012      30
    20-06-2012      20
    21-06-2012      30
    22-06-2012      30
    29-06-2012      20
    29-10-2012      30

Мне нужно присоединиться к 2 кадрам данных таким образом, что из другого фрейма данных я получаю среднюю стоимость между 1-15 июня 2012 года, чтобы заполнить стоимость 15-06-2012 и аналогично за 30-06-2012, я получаю среднее значение от 16 -06-2012 по 30-06-2012 и получить приведенные ниже результаты

 date            value cost
15-06-2012      20     15  which is (10+10+30+20+10+10)/6
30-06-2012      30     26  which is (30+20+30+30+20)/5
Теги:
pandas
dataframe
join
left-join

2 ответа

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

Измените дату datetime на дату вашего столбца, затем мы используем merge_asof

#df.date=pd.to_datetime(df.date,dayfirst=True)
#df1.date=pd.to_datetime(df1.date,dayfirst=True)
df['keepkey']=df.date
mergedf=pd.merge_asof(df1,df,on='date',direction ='forward')
mergedf.groupby('keepkey',as_index=False).mean()
Out[373]: 
     keepkey  cost  value
0 2012-06-15    15     20
1 2012-06-30    26     30

Обновить:

df['keepkey']=df.date
df['key']=df.date.dt.strftime('%Y-%m')
df1['key']=df1.date.dt.strftime('%Y-%m')
mergedf=pd.merge_asof(df1,df,on='date',by='key',direction ='forward')
mergedf.groupby('keepkey',as_index=False).mean()
Out[417]: 
     keepkey  cost  key  value
0 2012-06-15    15    6   20.0
1 2012-06-30    26    6   30.0
  • 0
    Привет! Используя это в моих фактических данных, я получаю неправильную стоимость, т.е. она заполняет стоимость 15 июня 2012 года стоимостью 16-06-2012 без учета средней суммы, вы понимаете? в моих фактических данных, имя столбца даты отличается, поэтому я использовал left_on и right_on и сгруппирован на основе столбца left_on
  • 0
    @ user3222101 мой df1 - твой второй df. DF ваш первый DF
Показать ещё 6 комментариев
3

Это потребует merge за которым следует groupby:

m = df.merge(df2, on='date', how='outer')
m['date'] = pd.to_datetime(m.date, dayfirst=True)
m = m.sort_values('date')

(m.groupby(m['value'].notnull().shift().fillna(False).cumsum(), 
           as_index=False)
  .agg({'date' : 'last', 'cost' : 'mean', 'value' : 'last'}))

        date  cost  value
0 2012-06-15  15.0   20.0
1 2012-06-30  26.0   30.0

Ещё вопросы

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