首页 > 解决方案 > Pandas 根据多个条件更改多个列

问题描述

我在这里显示了一个数据集示例:

df = pd.DataFrame({'product' : ['a', 'a', 'c', 'c', 'd', 'b', 'a', 'b', 'c'],
               'unit' : ['ng/L', 'k/uL', 'x10(3)/mcL', 'x10(3)/mcL', 'k/uL', 'ng/L', 'ng/L', 'sss', 'sss'],
           'value' : [0.2, 1.0, 67.0, 71.5, 23.2, 71.0, 0.44, 59.3, 12.7],
           'market_penetration_rate' : [0.82, 0.64, 77.5, 12.5, 22.5, 88.0, 0.34, 98.2, 87.4]})

我想获取 product = 'a' 和 'unit' = 'ng/l' 的所有行,并将值和单位转换为 value/1000 和 unit = 'ng/ml'

我几乎让它工作了,但我不知道如何在下面的代码中获取值并除以 1000

df.loc[(df['product'] == 'a') & (df['unit']== 'ng/L'), ['value', 'unit']] = ['value'/1000 ,'ng/mL'] 

代替 'value'/1000 我该放什么?如果我只是在方括号中使用了一个常量,那么它可以工作,但我想获取它已经存在的值并进行除法。

标签: pythonpandasdataframesubset

解决方案


你很接近,但我认为你需要为不同的操作分开更新命令:

mask = df['product'].eq('a') & df['unit'].eq('ng/L') 

# update value
df.loc[mask, 'value'] /= 1000

# update unit
df.loc[mask,'unit']='ng/mL'

输出:

  product        unit     value  market_penetration_rate
0       a       ng/mL   0.00020                     0.82
1       a        k/uL   1.00000                     0.64
2       c  x10(3)/mcL  67.00000                    77.50
3       c  x10(3)/mcL  71.50000                    12.50
4       d        k/uL  23.20000                    22.50
5       b        ng/L  71.00000                    88.00
6       a       ng/mL   0.00044                     0.34
7       b         sss  59.30000                    98.20
8       c         sss  12.70000                    87.40

推荐阅读