首页 > 解决方案 > 对多个熊猫数据框执行相同操作的正确方法是什么?

问题描述

我在尝试着:

  1. 检查数据框中是否存在范围内的值
  2. 如果没有,请添加值并进行插值。

参考这个答案,我已经检查过它是否适用于单个数据框。例如:

# Original dataframe

    code    ratio
...
5   5.0     1.649561
6   6.0     1.466403
7   11.0    1.696970
8   12.0    1.646259

# Code to add row + interpolate
for i in range(5, 13):
    if i not in df.values:
        df.loc[-1, 'code'] = i
        df = df.sort_values('code').reset_index(drop=True)
        df = df.interpolate()

# Result
code        ratio
0   5.0     1.649561
1   6.0     1.466403
2   7.0     1.581686
3   8.0     1.639328
4   9.0     1.668149
5   10.0    1.682559
6   11.0    1.696970
7   12.0    1.646259

检查它是否适用于单个数据帧,我希望它可以在我拥有的多个数据帧上完成。所以我尝试了以下代码,使用数据框列表进行迭代:

for df in [df1, df2, df3...]:
    for i in range(5, 13):
        if i not in df.values:
            df.loc[-1, 'code'] = i
            df = df.sort_values('code').reset_index(drop=True)
            df = df.interpolate()

然后即使对于之前工作的数据框,它也会返回:

code        ratio
5   5.0     1.649561
6   6.0     1.466403
7   11.0    1.696970
8   12.0    1.646259
-1  7.0     NaN

这显然不是我想要的结果。

是什么导致了这种差异?使用多个数据帧的列表进行迭代是一种错误的方法吗?

标签: pythonpandasdataframe

解决方案


您需要重新分配到列表中,然后解包,例如:

df_list = [df1, df2, df3...]
for i, df in enumerate(df_list):
    for j in range(5, 13):
        if j not in df.values:
            df.loc[-1, 'code'] = j
            df = df.sort_values('code').reset_index(drop=True)
            df = df.interpolate()
    df_list[i] = df

#Unpack back to original variables
df1, df2, df3, ... = df_list

推荐阅读