使用 loc 在 Pandas 数据框中设置值 - 多个选择条件允许在不同列中设置值

8

我有一个数据库,其中有多个列和行。我想要找到满足某些列的子集的特定条件的行,并且如果它满足该条件,则更改该行中不同列的值。

我正在使用以下数据库进行原型制作。

df = pd.DataFrame([[1, 2], [4, 5], [5, 5], [5, 9], [55, 55]], columns=['max_speed', 'shield'])
df['frcst_stus'] = 'current'
df

这将产生以下结果:

max_speed   shield  frcst_stus
0   1   2   current
1   4   5   current
2   5   5   current
3   5   9   current
4   55  55  current

我想将索引行2更改为5、5、'hello'而不更改数据框的其余部分。
我可以按照Pandas.loc文档中设置值的示例来完成。我可以设置一个行、一列和符合可调用条件的行。但是这个调用是在单个列或系列上进行的。我需要两个。
我已经找到了许多stackoverflow答案,这些答案使用loc在单个列上设置第二列的值。这不是我的问题。我想搜索两列数据。
下面的代码允许我获取所需的行:
result = df[(df['shield'] == 5) & (df['max_speed'] == 5) & (df['frcst_stus'] == 'current')]

我知道仅仅改变等号符号(== 'current')为(= 'current')会导致错误。

当我选择两列时,我可以设置这些列(如下所示),但是两列都会被设置。('arghh') 当我尝试测试'max_speed'的值时,我得到一个 false is not in index 错误。

df.loc[:, ['max_speed', 'frcst_stus']] = 'hello'

我尝试解释Python布尔问题时也遇到了错误。坦白地说,我还没有完全理解重载的整个概念。

1个回答

23

如果需要通过掩码 m 为两个列设置不同的值:

m = (df['shield'] == 5) & (df['max_speed'] == 5) & (df['frcst_stus'] == 'current')

df.loc[m, ['max_speed', 'frcst_stus']] = [100, 'hello']

如果需要通过掩码m将相同的值设置到两列中:

df.loc[m, ['max_speed', 'frcst_stus']] = 'hello'

如果需要根据掩码m仅设置一列:

df.loc[m, 'frcst_stus'] = 'hello'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接