【问题标题】:how to iterate over list of dataframes?如何迭代数据框列表?
【发布时间】:2021-07-10 08:10:41
【问题描述】:

基本上,我有 5 个 pd.dataframes,命名为=df0, df1, df2, df3, df4。我想做的是使用 for 循环将数据添加到这 5 个数据帧中。类似的东西:

for i, dataset in enumerate([df0,df1,df2,df3,df4]):
    dataset = pd.concat([dataset, NEW_DATA])

但是,当您这样做时(或者当您使用单独的列表而不是枚举时),“数据集”返回数据集,而不是名称(即 df0)。我该如何解决这个问题。例如,第二次迭代的输出应该是:

for i, dataset in enumerate([df0,df1,df2,df3,df4]):
    df1 = pd.concat([df1, NEW_DATA])

编辑:我也尝试过字典,例如 {'df0':df0... 等},但是,它再次打印数据集而不是数据集“变量名”。

【问题讨论】:

  • pd.concat([df0,df1,df2,df3,df4]) 怎么样?
  • 那行不通。由于数据插补算法,这些数据集应包含不同的值。该算法输出 5 个不同版本的“猜测”缺失数据,我想将它们附加到单独的数据集(在本例中为 df0....df4)。

标签: python pandas list dataframe for-loop


【解决方案1】:

您可以将新的df 重新分配到您的列表中:

# setup example
df0 = pd.DataFrame(np.random.randint(0, 10, (3, 2)))
df1 = pd.DataFrame(np.random.randint(0, 10, (3, 2)))
df2 = pd.DataFrame(np.random.randint(0, 10, (3, 2)))

# then
lst = [df0, df1, df2]
for i, df in enumerate(lst):
    newdata = pd.DataFrame([[0,0], [0,0]])  # (say)
    lst[i] = df.append(newdata)
df0, df1, df2 = lst
>>> df0
   0  1
0  8  7
1  9  1
2  5  6
0  0  0
1  0  0

但是,顺便说一句,如果您想通过名称而不是索引来引用它们,最好将 DataFrames 集合存储在 dict 而不是列表中。

【讨论】:

    【解决方案2】:

    编辑:重写解决方案以提供一些适当的实践。

    所以问题是你有一堆值需要通过重新分配来更新。如果您有 df1、df2、...,可能会出现风格问题,也许您更愿意将它们列在一个列表中。

    在任何情况下使用列表也是我解决问题的方法。

    dfs = [df0, df1, df2, ...]
    dfs = [pd.concat([df, NEW_DATA]) for df in dfs]
    [df0, df1, df2, ...] = dfs
    

    看看,如果您一般只使用dfs 并参考dfs[0] 而不是df0,这个解决方案几乎可以免费提供?

    【讨论】:

    • 基本上我要做的是运行一个输出 N 个数据帧的数据插补算法(在我的情况下为 5)。我运行算法 Y 次(每个位置都有缺失值),我想将 5 个数据帧中的每一个附加到我创建的数据帧:df0、df1、df2、df3、df4。
    • 不清楚为什么需要数据框的名称?
    • 好的我可能知道你的意思:你想分配回有问题的数据框,但是你把它的方式,它只会用一个新值覆盖局部变量,但不会改变原来的。通过写回d[name],可能会解决它
    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2022-06-15
    • 2020-07-30
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多