在多个熊猫数据帧上执行相同操作的正确方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在多个熊猫数据帧上执行相同操作的正确方法是什么?相关的知识,希望对你有一定的参考价值。
我正在尝试:
- 检查数据框中是否存在范围内的值
- 如果不是,则添加值并进行插值。
参考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
选项,因此这是不可行的。
以上是关于在多个熊猫数据帧上执行相同操作的正确方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章