【问题标题】:How to dynamically refer to dataframes in a for loop in Python如何在 Python 的 for 循环中动态引用数据帧
【发布时间】:2014-10-18 15:14:02
【问题描述】:

我对 python 很陌生,这可能是一个简单的问题,但我似乎找不到解决方案。

我有几个 pandas 数据框,其名称如下: 输出_1,输出_2,...,输出_n

我想总结它们的长度(如它们的行数),我想出了这样的东西:

sum =0
for num in range(1,n):
    nameframe="output_"+str(num)
    sum+=nameframe.shape[0]

问题在于 Python 将名称框视为字符串,而不是数据框的名称。

环顾四周,我发现了一个潜在的解决方案:

sum =0
for num in range(1,n):
    x = globals()["output_urls_%s" % num] 
    sum+=x.shape[0]

这似乎可行,但似乎非常不鼓励使用 globals()。 因此,实现我的目的最pythonic的方式是什么?

【问题讨论】:

  • 你处于一个需要大量工作的混乱局面,因为你一开始就没有坚持标准。与其手动创建所有数据框并为它们提供类似 df_id 的名称,不如在循环中创建它们并将它们粘贴到列表中。然后您可以遍历该列表。
  • 您可以在循环中使用nameframe = eval("output_"+str(num)),但我同意@FooBar 您应该在创建时将它们存储为列表,或者如果您想保留名称,请使用字典。
  • 好的,谢谢。我确实在列表中插入了数据框。它更整洁,更易于访问。

标签: python for-loop dynamic reference pandas


【解决方案1】:

最 Pythonic 的方式可能是将数据框存储在列表中。例如,

dfs = [output_1, output_2, ...]
df_length = sum(x.shape[0] for x in dfs)

或者,您可以考虑将数据存储在组合的 pandas 数据结构中,假设它们都以某种方式相关。例如,如果每个数据帧是不同的组,您可以在组合帧上设置 MultiIndex,例如

df = pd.concat([output_1, output_2, ...], keys=['group_a', 'group_b', ..]) 

那么你可以只取组合帧的长度。

【讨论】:

  • 你的第二行可以简化为df_length = sum(len(x) for x in dfs)
  • 谢谢,正如整个 cmets 所建议的那样,将数据帧存储在列表中是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2019-07-21
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多