使用和不使用.loc过滤熊猫数据框

时间:2019-10-09 07:35:55

标签: python pandas

关于过滤数据帧的概念,我有一个简单的问题。假设我有以下数据框:

df = pd.DataFrame({'AAA': [4, 5, 6, 7],'BBB': [10, 20, 30, 40],'CCC': [100, 50, -30, -50]})

df

我想根据某些条件对其进行一些修改。 如果运行以下代码,则会得到所需的行:

  

方法a

df[(df.AAA <= 5) & (df.BBB <= 10)]

a

我还可以使用以下代码获取该行:

  

方法b

df.loc[(df.AAA <= 5) & (df.BBB <= 10)]

b

方法a和方法b都导致熊猫数据帧。 但是,当我想根据这些条件修改列“ CCC”时,出现“方法a”错误:

  

方法a

df[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1
  

'Series'对象是可变的,因此不能被散列

     

方法b

df.loc[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1

b-1

1 个答案:

答案 0 :(得分:1)

如果需要通过掩码以及列名设置新值,则DataFrame.loc始终是必需的,因为在这里CCC中选择列名:

df.loc[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1
print (df)
   AAA  BBB  CCC
0    4   10   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

如果需要设置多个列,请使用loc和列名称列表:

df.loc[(df.AAA <= 5) & (df.BBB <= 10), ['CCC', 'AAA']] = -1
print (df)
   AAA  BBB  CCC
0   -1   10   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

但是,如果需要设置所有列,请删除loc以及列名:

df[(df.AAA <= 5) & (df.BBB <= 10)] = -1
print (df)
   AAA  BBB  CCC
0   -1   -1   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

编辑:

评论工作的解决方案:

df['CCC'][(df.AAA <= 5) & (df.BBB <= 10)] = -1 

但不建议使用,因为此代码可能会导致SettingWithCopyWarning