如何用一行代码批量修改Pandas DataFrame指定单元格的值?
问题描述
现有如下构造的Pandas DataFrame:
import pandas as pd df = pd.DataFrame( [[1, 2, 4], [1, 3, 1], [4, 6, 2]], columns=["A", "B", "C"], index=["Foo", "Bar", "Baz"], )
输出:
A B C Foo 1 2 4 Bar 1 3 1 Baz 4 6 2
还有一个通过标签定位指定单元格的Series:
series = pd.Series(data=["Baz", "Foo"], index=["A", "C"])
输出:
A Baz C Foo dtype: object
需求是把这些指定单元格的值乘以-1,得到目标DataFrame:
A B C Foo 1 2 -4 Bar 1 3 1 Baz -4 6 2
已知可以用循环实现:
for col, index in series.items(): df.loc[[index], [col]] = df.loc[[index], [col]] * -1
想问有没有一行代码的批量实现方式?
一行代码实现方案
当然可以,这里提供几种简洁的实现方式:
方法1:直接用df.loc精准定位修改
df.loc[series.values, series.index] *= -1
series.values是要修改的行索引列表(["Baz", "Foo"]),series.index是对应的列名列表(["A", "C"]),df.loc会直接定位到这两个交叉的单元格,一步完成乘-1的操作。
方法2:结合df.lookup提取值后更新
df.loc[series.values, series.index] = df.lookup(series.values, series.index) * -1
df.lookup能根据行和列的对应关系提取指定单元格的值,乘-1后再赋值回原位置,效果和方法1完全一致。
方法3:布尔掩码方式(需注意适用场景)
df[(df.index.isin(series.values)) & (df.columns.isin(series.index))] *= -1
⚠️ 注意:如果DataFrame里存在其他行+列的组合同时满足「行索引在series.values里、列名在series.index里」,这种方法会误修改这些额外的单元格,所以更推荐前两种精准匹配的方法。
内容的提问来源于stack exchange,提问作者bhub
相关产品推荐
相关产品推荐

