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