диапазон дат суммы данных в панде другого фрейма данных - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть два кадра данных. Я хочу суммировать столбец «сумма» во 2-м месте для каждой записи в первом файле данных.

Так для каждого

df1.Date = sum(df2.amount WHERE df1.Date <= df2.Date AND df1.yearAgo >= df2.Date)

df1 = pd.DataFrame({'Date':['2018-10-31','2018-10-30','2018-10-29','2018-10-28'],'yearAgo':['2017-10-31','2017-10-30','2017-10-29','2017-10-28']})

df2 = pd.DataFrame({'Date':['2018-10-30','2018-7-30','2018-4-30','2018-1-30','2017-10-30'],'amount':[1.0,1.0,1.0,1.0,0.75]})

желаемых результатов:

df1.Date     yearToDateTotalAmount
2018-10-31        3.0
2018-10-30        4.75
2018-10-29        3.75
2018-10-28        3.75

1 Ответ

0 голосов
/ 12 ноября 2018

IIUC, ваш ожидаемый результат должен иметь 4 в первом ряду.

Вы можете добиться этого очень эффективно, используя функцию numpy сравнения outer, поскольку less_equal и greater_equal ufunc с.

Обратите внимание, что

>>> np.greater_equal.outer(df1.Date, df2.Date)

array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True],
       [False,  True,  True,  True,  True]])

Так что вы можете получить свою маску по

mask = np.greater_equal.outer(df1.Date, df2.Date) & 
       np.less_equal.outer(df1.yearAgo, df2.Date)

И используйте outer multiplication + суммирование по axis=1

>>> np.sum(np.multiply(mask, df2.amount.values), axis=1)

Out[49]:
array([4.  , 4.75, 3.75, 3.75])

В конце концов, просто присвойте обратно

>>> df1['yearToDateTotalAmount'] = np.sum(np.multiply(mask, df2.amount.values), axis=1)

    Date        yearAgo     yearToDateTotalAmount
0   2018-10-31  2017-10-31  4.00
1   2018-10-30  2017-10-30  4.75
2   2018-10-29  2017-10-29  3.75
3   2018-10-28  2017-10-28  3.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...