如何在Python DataFrame中根据Circuit列条件新增Type列?
解决DataFrame新增Type列的问题
咱们先拆解下你现有代码里的几个核心问题,这也是导致运行失败的关键:
代码中的错误点
- 字符串与数字直接比较:你的
Circuit列是object类型(本质是字符串),直接用df5["Circuit"] >= 1000会触发类型错误,字符串没法和整数直接做大小比较。 .any()的误用:condition_2 = df5["Circuit"].str.contains('[a-zA-Z]').any()里的.any()会把整列的判断结果合并成一个单一布尔值(只判断列里是否存在符合条件的项),而不是逐行生成判断结果,这会让np.select无法匹配每行的规则。- condition_3逻辑错误:你写的
(df5["Circuit"].isdigit()) & (df5["Circuit"] <= 9999)既存在字符串和数字比较的问题,也没排除已经满足condition_1的情况,正确逻辑应该是「是纯数字但长度不是4位」。
修正后的代码
我们可以通过纯数字校验+字符串长度判断来适配object类型的列,完美匹配你的规则:
import numpy as np import pandas as pd # 模拟你的原始DataFrame data = { "Circuit": ["6026", "5011", "50", "9023", "85GA", "90CO"], "Size": ["Large", "Very Small", "Small", "Very Small", "Very Small", "Large"] } df = pd.DataFrame(data) # 重新定义符合规则的条件 condition_1 = df["Circuit"].str.isdigit() & (df["Circuit"].str.len() == 4) condition_2 = df["Circuit"].str.contains('[a-zA-Z]', na=False) condition_3 = df["Circuit"].str.isdigit() & (df["Circuit"].str.len() != 4) # 用np.select给Type列赋值 df["Type"] = np.select([condition_1, condition_2, condition_3], ["1", "2", "3"], default="") print(df)
代码说明
- condition_1:先通过
str.isdigit()判断是否为纯数字,再用str.len() ==4确保是4位,完美匹配规则1的「4位整数」要求。 - condition_2:去掉
.any(),直接用str.contains逐行判断是否包含字母,na=False是为了处理可能存在的空值(如果你的数据里有的话)。 - condition_3:判断是纯数字但长度不等于4位,正好对应规则3的要求。
运行后就能得到你期望的结果:
Circuit Size Type 0 6026 Large 1 1 5011 Very Small 1 2 50 Small 3 3 9023 Very Small 1 4 85GA Very Small 2 5 90CO Large 2
内容的提问来源于stack exchange,提问作者vcodingadventures
相关产品推荐
相关产品推荐

