Pandas中基于同行其他列值更新单元格值的问题求助
解决DataFrame条件更新列值的问题
先帮你梳理下代码没生效的几个核心问题:
- 循环逻辑错位:你遍历的是
datagrouped['List Price Currency']的每个元素,但判断时却拿字符串'List Price Currency'和值做比较,完全没用到每行的实际数据——比如if 'List Price Currency' == "USD"这个判断永远是False,因为字符串本身不等于"USD"。 - 赋值运算符误用:你用了
==(比较相等的运算符)而不是=(赋值运算符),就算判断逻辑对了,也只是做了个比较,根本不会修改单元格的值。 - 拼写错误:最后一行的
"List Pricy Currency"多了个字母y,应该是"List Price Currency"。 - 低效遍历方式:pandas里尽量别用for循环逐个处理单元格,不仅效率低,还容易出错,用向量化操作才是最佳实践。
下面给你两种贴合需求的实现方式,都是pandas推荐的高效写法:
方法一:用np.select实现多条件优先级映射
这种方式适合多条件的优先级判断,咱们先把条件和对应结果按优先级排序(比如先处理GBP、EUR这类特殊币种,再处理Amer,最后用默认值):
import numpy as np # 定义条件列表和对应的目标值 conditions = [ datagrouped['Price Book Name'].str.contains('GBP', na=False), datagrouped['Price Book Name'].str.contains('EUR', na=False), datagrouped['Price Book Name'].str.contains('Amer', na=False) ] values = [ 'UK List', 'Euro List', 'USD List' ] # 应用条件,不符合任何条件时用默认值"Intl USD" datagrouped['List Price Currency'] = np.select(conditions, values, default='Intl USD')
方法二:用loc逐条件赋值
这种方式更直观,按顺序给符合条件的行赋值,注意把优先级高的条件放在后面(后面的赋值会覆盖前面的):
# 先给所有行设置默认值 datagrouped['List Price Currency'] = 'Intl USD' # 处理包含"Amer"的情况 datagrouped.loc[ datagrouped['Price Book Name'].str.contains('Amer', na=False), 'List Price Currency' ] = 'USD List' # 处理包含"GBP"的情况(优先级高于Amer,所以放在后面覆盖) datagrouped.loc[ datagrouped['Price Book Name'].str.contains('GBP', na=False), 'List Price Currency' ] = 'UK List' # 处理包含"EUR"的情况(优先级高于Amer) datagrouped.loc[ datagrouped['Price Book Name'].str.contains('EUR', na=False), 'List Price Currency' ] = 'Euro List'
这里的na=False是为了处理Price Book Name列中的空值,避免因空值导致判断结果为NaN。
如果你确实需要基于List Price Currency的原始值再做判断(比如你代码里提到的if 'List Price Currency' == "USD"),可以先复制原始列到临时列,避免修改过程中影响判断逻辑:
# 复制原始列到临时列 datagrouped['Original_Currency'] = datagrouped['List Price Currency'].copy() # 基于原始值+Price Book Name判断 datagrouped.loc[ (datagrouped['Original_Currency'] == 'USD') & datagrouped['Price Book Name'].str.contains('Amer', na=False), 'List Price Currency' ] = 'USD List' datagrouped.loc[ (datagrouped['Original_Currency'] == 'USD') & ~datagrouped['Price Book Name'].str.contains('Amer', na=False), 'List Price Currency' ] = 'Intl USD' datagrouped.loc[datagrouped['Original_Currency'] == 'GBP', 'List Price Currency'] = 'UK List' datagrouped.loc[datagrouped['Original_Currency'] == 'EUR', 'List Price Currency'] = 'Euro List' # 最后删除临时列 datagrouped.drop('Original_Currency', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者Warthog1
相关产品推荐
相关产品推荐

