Соединение двух фреймов данных путем суммирования значений между двумя датами, эквивалентных сумме - PullRequest
0 голосов
/ 10 мая 2018

У меня есть два кадра данных, df1 и df2:

import pandas as pd
import datetime
import numpy as np
df1 = pd.DataFrame()
df1["StartDate"] = pd.date_range(start=('2016/01/01'), end = ('2017/12/31'), 
freq="6D")
df1["EndDate"] = df1["StartDate"] + datetime.timedelta(5)
df1["Value_three"] =  pd.Series(np.random.randn(len(df.Date))+2)

У df1 есть дата начала, дата окончания и значение (с именем value_three). У df2 есть дата, value_one и значение два.

df2 = pd.DataFrame()
df2["Date"] = pd.date_range(start=('2016/01/01'), end=('2017/12/31'), freq="D")
df2["Value_one"] = pd.Series(np.random.randn(len(df.Date)))
df2["Value_two"] = pd.Series(np.random.randn(len(df.Date))+1)

То, чего я хочу добиться, похоже на функцию SUMIFS в Excel:

SUMIFS

В этом случае я бы хотел добавить к df1 два столбца, которые суммируются по значениям_1 и value_2 соответственно, где столбец «Дата» равен df2 между df1.StartDate и df1.EndDate.

Предположим, что невозможно предварительно агрегировать это в Vertica / MSSQL / etc. Мы также не можем использовать повторную выборку, поскольку начальная и конечная даты могут быть нерегулярными (в данном случае, разделенными на 11 дней, но разрыв может постоянно изменяться).

Я пытался объединиться, объединить, растопить, объединить, и я доказал свою неудачу! Надеюсь, кто-то может помочь.

1 Ответ

0 голосов
/ 10 мая 2018

Это может быть не самым эффективным, но это работает! Мне бы тоже хотелось узнать о наиболее эффективном способе сделать это!

Решение:

def getForDF1(row):
    row['Value_1'],row['Value_2']= \
    df2[(df2['Date']>=row['StartDate']) & (df2['Date']<=row['EndDate'])].sum()[['Value_1','Value_2']]
    return row 

df1=df1.apply(getForDF1,axis=1)

P.S. Ваш код не работает, так как timedelta не может работать для всей серии.

df1["EndDate"] = df1["StartDate"] + datetime.timedelta(5)

Чтобы упростить иллюстрацию, я изменил значения вашего df:

Начальная настройка:

import pandas as pd

StartDate=['2016-01-01','2016-01-13','2016-01-25','2016-02-06','2016-02-18']
EndDate=['2016-01-12','2016-01-24','2016-01-05','2016-02-17','2016-02-29']
value_3=[1,2,3,4,5]

Date=['2016-01-01','2016-01-02','2016-02-10','2016-02-11','2016-02-18']
value_1=[3,4,5,6,7]
value_2=[0,1,3,5,7]

df1=pd.DataFrame({'StartDate':StartDate,'EndDate':EndDate,'Value_3':value_3})
df2=pd.DataFrame({'Date':Date,'Value_1':value_1,'Value_2':value_2})

df1['EndDate']=pd.to_datetime(df1['EndDate'])
df1['StartDate']=pd.to_datetime(df1['StartDate'])
df2['Date']=pd.to_datetime(df2['Date'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...