首页 > 解决方案 > Python:更新数据框中的值

问题描述

我有一个包含 1000 条记录的数据框,其中 Group= ["India","Germany","China",....]。

我正在更新两列(大约 200 条记录,其中 Group == 'India'):New_Operator、Level

前两行代码正在更新“New Operator”和“Level”的记录。

问题是:第3 行和第 4 行代码正在替换之前更新的代码(前两行):

新操作员=> 以前更新为“印度”=> 替换为“本地”

Level=> 之前更新为“L1”=> 被替换为“Non L1”

df.loc[(df.Group == 'India') & ((df.Circle == 'Andhra Pradesh') | (df.Circle == 'Chennai') | (df.Circle == 'Delhi') | (df.Circle == 'Gujrat') | (df.Circle == 'Karnataka') | (df.Circle == 'Tamil Nadu')) , 'New_Operator'] = 'India'

df.loc[(df.Group == 'India') & ((df.Circle == 'Andhra Pradesh') | (df.Circle == 'Chennai') | (df.Circle == 'Delhi') | (df.Circle == 'Gujrat') | (df.Circle == 'Karnataka') | (df.Circle == 'Tamil Nadu')) , 'Level'] = 'L1'

print(df)

df.loc[(df.Group == 'India') & ((df.Circle != 'Andhra Pradesh') | (df.Circle != 'Chennai') | (df.Circle != 'Delhi') | (df.Circle != 'Gujrat') | (df.Circle != 'Karnataka') | (df.Circle != 'Tamil Nadu')) , 'New_Operator'] = 'Local'

df.loc[(df.Group == 'India') & ((df.Circle != 'Andhra Pradesh') | (df.Circle != 'Chennai') | (df.Circle != 'Delhi') | (df.Circle != 'Gujrat') | (df.Circle != 'Karnataka') | (df.Circle != 'Tamil Nadu')) , 'Level'] = 'Non L1'

print(df)

我希望根据特定的“Circle”(如代码中所述)在 Group == 'India' & 处更新输出。是否有更新值而不替换先前更新的值的解决方案?

标签: python-3.xpandas

解决方案


您的布尔表达式不是唯一的

(df.Group == 'India') & ((df.Circle == 'Andhra Pradesh') |
(df.Circle == 'Chennai') |
(df.Circle == 'Delhi') ...)

如果 df.Circle 等于 'Andhra Pradesh' 并且还:

(df.Group == 'India') & ((df.Circle != 'Andhra Pradesh') |
(df.Circle != 'Chennai') | ...)

如果 df.Circle 等于 'Andhra Pradesh',则计算结果为真,因为 OR 条件对除 df.Circle != 'Andhra Pradesh' 之外的所有条件都为真,因此总体返回 True。

您需要将第二组条件更改为 & ,如下所示:

(df.Group == 'India') & ((df.Circle != 'Andhra Pradesh') &
(df.Circle != 'Chennai') & ...)

我也建议使用

df.Circle.isin(['Andhra Pradesh','Chennai', ... ])

~df.Circle.isin(['Andhra Pradesh','Chennai', ... ])

因为在这种情况下,这些方法可能更容易正确


推荐阅读