使用日期范围内的总和将列添加到数据框

时间:2019-04-09 11:11:35

标签: python pandas apply

我有两个包含有关帐户信息的数据框。一种使用策略(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 :(“系列的真值不明确。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。”, '发生在索引0')

1 个答案:

答案 0 :(得分:0)

当您使用包含多于1列的lambda函数时,请尝试使用.applymap而不是.apply