如何利用另一列数据修改pandas DataFrame指定子集的列值
正确实现方案
方法1:loc索引直接赋值(推荐)
你不需要使用apply,直接通过loc指定筛选条件和目标列,直接完成赋值即可,代码如下:
# 先定义筛选掩码,后续复用也方便 mask = df['A'] == 2 # 仅对符合条件的行修改B列值,取值为对应行B+C的结果 df.loc[mask, 'B'] = df.loc[mask, 'B'] + df.loc[mask, 'C']
也可以简化写法,pandas会自动对齐索引,效果完全一致:
df.loc[df['A'] == 2, 'B'] = df['B'] + df['C']
方法2:eval方法简化运算
如果运算逻辑更复杂,也可以用eval方法简化列运算的写法:
df.loc[df['A'] == 2, 'B'] = df.eval('B + C')
报错原因
你之前的写法报错是因为:df.loc[(df['A']==2), 'B']是长度为2的Series,apply遍历的时候拿到的是每个单独的B列值,你用单个数值去加整个长度为6的C列Series,pandas索引对齐失败,就抛出了InvalidIndexError。
另外补充:这类DataFrame子集的列运算尽量用pandas原生的向量化操作实现,比apply逐行遍历的效率高很多,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者Stephen Mason
相关产品推荐
相关产品推荐

