我有两个包含有关帐户信息的数据框。一种使用策略(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')
答案 0 :(得分:0)
当您使用包含多于1列的lambda函数时,请尝试使用.applymap而不是.apply