Python 过滤和覆盖数据帧不会改变数据帧
我试图对两个数据帧执行相同的操作(过滤),但由于某些原因,数据帧没有更改。我怀疑这与数据帧问题的视图与副本有关,但我无法找到解决该问题的答案 下面是一个简单的代码,再现了这个问题:Python 过滤和覆盖数据帧不会改变数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我试图对两个数据帧执行相同的操作(过滤),但由于某些原因,数据帧没有更改。我怀疑这与数据帧问题的视图与副本有关,但我无法找到解决该问题的答案 下面是一个简单的代码,再现了这个问题: In [1]: import pandas as pd df1 = pd.DataFrame(data = [(1,2,3),(4,5,6),(7,'a',9)], columns = ['a','b','c']) df2 = pd.DataFrame(data = [(1,2,3),(4,'a',6),
In [1]:
import pandas as pd
df1 = pd.DataFrame(data = [(1,2,3),(4,5,6),(7,'a',9)], columns = ['a','b','c'])
df2 = pd.DataFrame(data = [(1,2,3),(4,'a',6),(7,8,9)], columns = ['a','b','c'])
dataframes = [df1, df2]
for df in dataframes:
df = df[(df.b != 'a') & (df.c > 5)]
print df
Out[1]:
a b c
1 4 5 6
a b c
2 7 8 9
In [2]:
for df in dataframes:
print df
Out[2]:
a b c
0 1 2 3
1 4 5 6
2 7 a 9
a b c
0 1 2 3
1 4 a 6
2 7 8 9
在Python中。
赋值语句不修改值,而是将变量名重新绑定到新值
例如,当您使用循环的时,如下所示:
for df in dataframes:
Python将dataframes
中的值绑定到变量名df
(循环每次迭代的新值)。
任务
df = df[(df.b != 'a') & (df.c > 5)]
只需将df
重新绑定到新值即可。它对数据帧没有影响
要更改dataframes
的值,可以使用构建新列表并将dataframes
分配给此新列表:
dataframes = [df[(df.b != 'a') & (df.c > 5)] for df in dataframes]
屈服
a b c
1 4 5 6
a b c
2 7 8 9
您应该使用.loc
和直接指向列表项s,否则新的数据帧值将与df
变量绑定
比如说
for k in range(0, len(dataframes)):
dataframes[k] = dataframes[k].loc[(dataframes[k].b != 'a') & (dataframes[k].c > 5)]
print dataframes[k]
a b c
1 4 5 6
a b c
2 7 8 9
产生
for df in dataframes:
print df
a b c
1 4 5 6
a b c
2 7 8 9
看
编辑:最好使用列表理解(请参见@unutbu-answer)谢谢,这很有效。指向“名称和值”文章的链接非常有用。可能是我应该早点学习的:)
for df in dataframes:
print df
a b c
1 4 5 6
a b c
2 7 8 9