【问题标题】:Apply function to several DataFrames by creating new DataFrame通过创建新的 DataFrame 将函数应用于多个 DataFrame
【发布时间】:2021-12-31 14:31:28
【问题描述】:

可能有人可以帮我找到解决方案:

我有 100 个数据框。每个数据帧包含时间 / High_Price / Low_price 我想创建新的 Dataframe,其中包含来自每个 DataFrame 的增益。

例子:

df1 = pd.DataFrame({"high":[5,4,5,2], 
                      "low":[1,2,2,1]},
                      index=["2019-04-06","2019-04-07","2019-04-08","2019-04-09"])

df100 = pd.DataFrame({"high":[7,5,6,7], 
                      "low":[1,2,3,4]},
                      index=["2019-04-06","2019-04-07","2019-04-08","2019-04-09"])

功能:

def myfunc(data, amount):
    data= data.loc[(data!=0).any(1)]
    profit = (amount/data.iloc[0]['low']) * data.iloc[-1]['high']
    return profit

输出应该是:

output= pd.DataFrame({"Gain":[1,6]},
                      index=["df1","df100"])

如何将函数应用于 100 个 DataFrame,并通过创建 DataFrame 仅从它们中获取 Gains,我们可以在其中看到 DataFrame 的名称和该 DataFrame 的 Gain?

【问题讨论】:

  • 调用函数时amount从哪里来?所有 dfs 都一样吗?
  • amount 对于所有 DataFrame 总是相同的,可以只有 1。

标签: python pandas dataframe function lambda


【解决方案1】:

将您的数据框放在一个列表中,并通过整数索引访问它们。将变量命名为df1 到df100 是不好的编程风格,因为a)数据帧属于一起,所以将它们放在一个集合(例如列表)中,b)你不能从它的值中获取对象的“名称”,导致解决诸如您现在面临的并发症。

所以让dfs 成为您的 100 个数据帧的列表,从索引 0 开始。

使用

amount = ... # the value you want to use
output = pd.DataFrame([myfunc(df, amount) for df in dfs], columns=['Gain'])

output 的索引现在对应于dfs 的索引,从 0 开始。没有理由将其重命名为 'df1' ... 'df100',您没有获得任何信息,并且输出变得更难处理。


如果是任意数据框名称,请使用将名称映射到 df 的字典。让我们再次称它为dfs。然后使用

amount = ... # the value you want to use
output = pd.DataFrame([myfunc(df, amount) for df in dfs.values()], columns=['Gain'], index=dfs.keys()])

我假设myfunc 是正确的,我没有调试它。

【讨论】:

  • 我对 DF 有不同的名称,这里只是一个例子。试图将 DF 放到一个列表中,然后应用代码:'numpy.float64' 对象没有属性 'apply' ... 现在看来我的 .iloc 或数据类型有问题。
  • @Val.Val 在这种情况下使用将 df-names 映射到 dfs 的字典。我没有调试你的函数。
猜你喜欢
  • 2020-11-15
  • 2018-06-07
  • 2020-08-11
  • 2020-05-11
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2021-08-23
  • 2020-07-13
相关资源
最近更新 更多