【问题标题】:How to append multiple dataframes with same prefix in python如何在python中附加多个具有相同前缀的数据帧
【发布时间】:2019-08-29 03:36:14
【问题描述】:

我有多个这样的顺序数据帧:

df1 = pd.DataFrame( [['tom', 10], ['nick', 15], ['juli', 14]] ,  columns = ['Name', 'Age'])
df2 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] ,  columns = ['Name', 'Age'])
df3 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] ,  columns = ['Name', 'Age'])
df4 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] ,  columns = ['Name', 'Age'])

我需要创建一个 for 循环来附加它们并获取一个新的数据框。 我尝试了下面的代码,但它不起作用,因为 python 将 df1 识别为字符串。

tempdf = df1
for i in range(2,4):
     tempdf = tempdf.append(("df"+str(i)))
     print(tempdf)

如何让 python 将它们识别为我创建的数据框对象?

【问题讨论】:

  • 如果我是你,我将创建一个包含所有数据框的列表。即df = [df1, df2, df3, df4]。你提到你有 20 个数据帧,我觉得有点难以相信它们都是手工编码的。如果数据帧来自可迭代对象,我建议将该结果也存储在可迭代对象中......

标签: python pandas append


【解决方案1】:

首先,我要强调的是,必须这样做表明源数据帧的生成方式存在问题,您应该考虑解决该问题。

使用 Python,几乎可以做任何你想做的事情。是否可取利用这种权力完全是另一个问题。

在这种情况下,最安全的方法可能是使用globals()

n_dataframes = 4
g = globals()
dataframes = [g[f'df{i}'] for i in range(1, n_dataframes + 1)]

result_df = pd.concat(dataframes)    
print(result_df)

输出:

   Name  Age
0   tom   10
1  nick   15
2  juli   14
0   tom   10
1  nick   15
2  juli   14
0   tom   10
1  nick   15
2  juli   14
0   tom   10
1  nick   15
2  juli   14

您可以对结果进行进一步处理,例如调用reset_index

另一种选择是使用eval,它坚定地转向“除非你真的知道自己在做什么,否则你不应该这样做”领域,因为它允许执行任意代码:

dataframes = [eval(f'df{i}') for i in range(1, n_dataframes + 1)]

请注意,上面的代码使用 f-strings,这是仅在 Python 3.6 中引入的语法。因此,如果您的 Python 版本低于该版本,请将 f'df{i}' 替换为 'df{}'.format(i)

【讨论】:

  • 顺便说一句,很高兴提到 f-string 仅在 python 3.6 及更高版本中受支持。
【解决方案2】:

您的方向正确,只需使用eval

tempdf = df1
for i in range(2,4):
     tempdf = tempdf.append(eval("df"+str(i)))
     print(tempdf)

注意:使用 eval 可以运行任意代码,使用它被认为是一种不好的做法。如果可能,请尝试使用其他方式。

【讨论】:

  • 这是一个不好的做法,同意,但在 OP 的情况下,它似乎是一个最简单的替代解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多