关于过滤数据帧的概念,我有一个简单的问题。假设我有以下数据框:
df = pd.DataFrame({'AAA': [4, 5, 6, 7],'BBB': [10, 20, 30, 40],'CCC': [100, 50, -30, -50]})
我想根据某些条件对其进行一些修改。 如果运行以下代码,则会得到所需的行:
方法a
df[(df.AAA <= 5) & (df.BBB <= 10)]
我还可以使用以下代码获取该行:
方法b
df.loc[(df.AAA <= 5) & (df.BBB <= 10)]
方法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
答案 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 。