【问题标题】:Adding Dataframes from a List of Dataframes using another List使用另一个列表从数据框列表中添加数据框
【发布时间】:2019-05-20 22:34:27
【问题描述】:

我在数据框列表中添加多个数据框时遇到问题。我的目标是根据另一个列表中的标准从数据框列表中添加数据框。

示例:假设我们有一个包含 10 个数据帧的列表,DfList 和另一个名为 OrderList 的列表。

假设OrderList = [3, 2, 1, 4]

然后我想以[DfList(0) + DfList(1) + DfList(2), DfList(3) + DfList(4), DfList(5), DfList(6) + DfList(7) + DfList(8) + DfList(9)] 的形式获取一个包含 4 个 Dataframe 的新列表

我尝试了几种使用DataFrame.add 创建函数的方法。最初,我希望我可以使用 sum(DfList(0), DfList(1), DfList(2)) 的形式来执行此操作,但很快我发现 sum() 似乎不受 DataFrames 的支持。

我希望使用 sum(DfList[0:2]) 之类的东西并使 OrderList 累积,所以我可以只使用 sum(DfList[OrderList[i]:OrderList[i+1]]) 但不断收到 unsupported operand type 错误。

是否有一种我没有考虑的简单方法,或者是否有完全不同的方法,你会建议?

编辑:我正在寻找的输出是另一个 DataFrames 列表,其中包含基于OrderList 的四个求和 DataFrames(跨所有列。)三个 DataFrames 加在一起用于第一个,两个用于第二个,一个用于第三个,和四对四。

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!我对这个问题有点困惑。首先,您有一个 DataFrame 列表,对吗?你想创建一个新的 DataFrame 列表还是创建一个新的 DataFrame 是其他的总和?二、OrderList在其中起到了什么作用?
  • 我很抱歉;我应该措辞更好。我正在寻找新的 DataFrames 列表,其中包含由列表 OrderList 定义的较小列表的总和(我应该使用更好的名称。)所以对于第一个 DataFrame,我正在寻找前三个所有列的总和, 第二个 DataFrame 是接下来两个的所有列的总和,第三个 DataFrame 是下一个的所有列的总和,第四个 DataFrame 是最后四个的所有列的总和。
  • 这里你要问两件事...首先,如何使用OrderList=[3, 2, ...] 将前三个元素相加,然后是接下来的两个,等等。接下来,您要问如何添加不同的元素数据帧的数量。下面的人已经回答了第二个问题 :) 对于第一个问题,您应该从更简单的东西开始,例如将 [1, 2, 3, 4, 5] 与订单 [2, 3] 相加得到 [3, 12]。这样您就不必担心任何数据结构,只需担心语言。抱歉,我没有时间为您提供答案,但这应该不难,尽力而为:)

标签: python list dataframe addition


【解决方案1】:

如果你有你所说的DataFrames列表,你可以使用操作sum(DfList[0:2]),但你需要注意列表中每个DataFrame中列的顺序,因为添加时使用提供的顺序数据帧。不会根据列的名称进行添加。如果需要,可以更改列的顺序,如其他 question 所示。

这个例子说明了这个问题:

import pandas as pd

df1 = pd.DataFrame({1:[1,23,4], 2:['x','y','z']})
df2 = pd.DataFrame({2:['x','y','z'], 1:[1,23,4]})

try:
    df1 + df2
except TypeError:
    print("Error")

df1 = pd.DataFrame({1:[1,23,4], 2:['x','y','z']})
df2 = pd.DataFrame({1:[1,23,4], 2:['x','y','z']})

#works fine
df1 + df2

另外,您在sum(DfList[OrderList[i]:OrderList[i+1]]) 中用于累积和的逻辑不正确。在这种情况下,OrderList 还需要是累积的,并且有一个额外的元素从零开始,因此您将使用OrderList = [0, 3, 5, 6, 10] 而不是OrderList = [3, 2, 1, 4]

【讨论】:

  • 我很抱歉,我应该更好地解释这个问题。我在尝试中将 0 添加到列表中,并使用了np.cumsum,但我遇到的问题更多是由于添加了 DataFrames 本身。拼出 df1+df2+df3+df4 是个问题,因为加法本身要在不同数量的 DataFrame 上完成。 df1 + df2 + df3 对我有用,但添加的 dfs 数量需要根据OrderList 进行更改。这就是我偏向sum(DfList[OrderList[i]:OrderList[i+1]]) 的原因。虽然 df1 + df2 +df3 对我有用,但 sum(df1, df2, df3) 不是。
  • 为了让它与sum函数一起工作,你只需要将DataFrames包装在一个列表中,所以你应该使用sum(df1, df2, df3)而不是sum(df1, df2, df3)
  • 我似乎仍然收到unsupported operand type(s) for +: 'int' and 'list' 错误。我正在使用的 sn-p 给我的是for i in range(len(OrderList)): sum([DfList[OrderList[i]:OrderList[i+1]]])。我也试过for i in OrderList: sum([DfList[i:i+1]])。注意我在np.cumsum(OrderList)前面加了0。
  • 很抱歉,后续跟进晚了,但为了提供一些结束,我最终重写了我正在处理的大部分内容,然后佩德罗建议在使用总和之前将其包装在一个列表中工作顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2019-03-19
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多