【问题标题】:Adding column to dataframe with sum from date range使用日期范围的总和将列添加到数据框
【发布时间】:2019-08-30 16:03:01
【问题描述】:

我有两个包含帐户信息的数据框。一个带有策略(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: ("No axis named . at 0x11ac976a8> for object type ", 'occured at index 0')

选项2产生ValueError: ('一个Series的真值是不明确的。使用a.empty, a.bool(), a.item(), a.any() or a.all().', '发生在索引 0')

【问题讨论】:

    标签: python pandas apply


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2020-06-12
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多