在多个熊猫数据帧上执行相同操作的正确方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在多个熊猫数据帧上执行相同操作的正确方法是什么?相关的知识,希望对你有一定的参考价值。

我正在尝试:

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

参考this answer,我检查了它是否适用于单个数据帧。例如:

# 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

显然不是我想要的结果。

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

答案

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

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
另一答案

您可以使用inplace=True直接在列表中的每个数据框上进行修改。由于数据框列表是每个数据框的浅表副本,因此对其进行的任何修改都会影响原始数据框。但是,此方法不允许链接方法,因此您需要使用inplace=True将chain命令分解为单独的方法调用。该方法利用列表创建数据帧的浅表副本

Sample dataframes

In [153]: df1
Out[153]:
   code     ratio
0   5.0  1.649561
1   6.0  1.466403
2  11.0  1.696970
3  12.0  1.646259

In [155]: df2
Out[155]:
   code     ratio
0   5.0  1.649561
1   6.0  1.466403
2  11.0  1.696970
3  19.0  1.646259

dfs = [df1, df2]

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

输出

In [168]: df1
Out[168]:
   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.682560
6  11.0  1.696970
7  12.0  1.646259

In [169]: df2
Out[169]:
   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.682560
6  11.0  1.696970
7  12.0  1.671615
8  19.0  1.646259

Note:此解决方案仅用于证明它对这个特定问题是可行的。在更复杂的问题上,由于某些命令不支持inplace并且Pandas不赞成使用inplace选项,因此这是不可行的。

以上是关于在多个熊猫数据帧上执行相同操作的正确方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在数据帧上具有中位数的 fillna 仍然在熊猫中留下 Na/NaN?

如何在熊猫数据帧上迭代 TfidfVectorizer()

Python:在熊猫数据帧上使用多处理

熊猫逐渐减去日期,直到满足数据帧上的条件

迭代多个数据帧并执行数学函数保存输出

同一数据帧上的多个总和