Python 在多个数据帧上执行相同操作的正确方法是什么?
我正在努力:Python 在多个数据帧上执行相同操作的正确方法是什么?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在努力: 检查数据帧中是否存在范围内的值 如果不是,则添加值并插值 关于,我已经检查了它是否适用于单个数据帧。例如: # 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): i
# 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
注意:此解决方案只是为了证明它在这个特定问题上是可行的。在更复杂的问题上,这将是不可行的,因为一些命令不支持
inplace
,Pandas正在弃用inplace
选项。我建议使用dict
作为带有键df1
,df2
的数据帧的容器。。。而不是list
这里虽然抱歉,它似乎不起作用。假设df1
是我主要检查的数据帧,在使用您的代码并再次使用df1
检查之后,我的问题仍然得到了不想要的结果。即使将df.loc[-1,'code']=i
更改为df.loc[-1,'code']=j
是的,如果您使用列表,它也不会更改该变量,但它会更改df_list[0]
-这就是为什么最好使用dictdf_dict={'df1':…}
,然后,您可以迭代并更新这些值,并使用df_dict['df1']
返回它。好的,这需要对代码进行一些总体更改。。。但我会努力的。即使有效,我也无法接受你的答案。我建议在这样的情况下,在迭代修改数据帧时,最好使用dict
,使用键df1
,df2
…使用对名称进行迭代,在df_dict.items()中使用df:
,然后使用df_dict[name]返回=df
似乎也不起作用:(将其解包回原始变量名如何?…所以在我建议的循环之后,最后一行将是df1,df2,df3=dfu list
更好的方法是dict
-imho:)签出并