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

У меня есть два кадра с информацией об аккаунтах. Один со стратегиями (df) и один с транзакциями (df2). Мне нужен еще один столбец в кадре транзакции-данных, с которым у каждой учетной записи есть стратегия на дату транзакции.

Я думаю о двух решениях, использующих функции df.apply и lambda, которые используют входную дату и учет из транзакций и стратегию возврата. Оба порождают ошибки. Сейчас я ищу какой-нибудь способ двигаться вперед. Спасибо.

import pandas as pd


strategy_data = [['001', '2018-03-02', '2018-03-04', 'strat1'],['001', '2018-03-05', '2018-03-10', 'strat2'],['002', '2018-02-01', '2018-03-02', 'strat2']]
df = pd.DataFrame(strategy_data, columns = ['acc', 'd1', 'd2', 'strat'])

transaction_data = [['001', '2018-03-02', 234], ['001', '2018-03-03', 432], ['001', '2018-03-07', 543], ['002', '2018-02-20', 543]]
df2 = pd.DataFrame(transaction_data, columns = ['acc', 'd', 'am'])

Идея 1

def return_strat(acc, date):
    df3 = df.loc(lambda df: df['acc'] == acc)
    df3 = df3.loc(lambda df3: df3['d1'] < date)
    df3 = df3.loc(lambda df3: df3['d2'] > date)
    return df3['strat'].value

df2['strat'] = df2.apply(lambda row : return_strat(row['acc'], row['d']), index=1)

Идея 2

df2['strat'] = df2.apply(lambda row : df.loc((df.acc == row['acc']) & ( df.d1 <= row['d'] <= df.d2)), axis=1)

Ожидаемый результат - новый столбец в df2 с текущей стратегией для каждой транзакции.

Опция 1 генерирует ValueError: («Не указана ось в 0x11ac976a8> для типа объекта», «произошло с индексом 0»)

Опция 2 генерирует ValueError: ('Истинное значение Series является неоднозначным. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().', 'произошло с индексом 0')

1 Ответ

0 голосов
/ 09 апреля 2019

Попробуйте использовать .applymap вместо .apply, если вы используете лямбда-функцию, которая занимает более 1 столбца

...