基于另一列kV值修改DataFrame列值的技术实现求助
处理DataFrame列值的条件修改方案
核心逻辑梳理
- 仅在**B列值为"sampletext"且C列原值不是"generation"**时,才对C列进行修改
- 从A列提取kV对应的数字(忽略其他数字):使用正则
(\d+)(\s|.)((?i:kv))捕获数字部分 - 提取到的数值判断规则:
- 数值≥110 → C列改为
Transmission - 数值<110 或 无有效数值 → C列改为
Distribution
- 数值≥110 → C列改为
代码实现
import pandas as pd import numpy as np # 示例输入数据 df = pd.DataFrame({ 'A': ['220kV变电站', '10kv线路', '35. Kv设备', '500伏变压器', 'sample 110KV', '无kV标识'], 'B': ['sampletext', 'sampletext', 'sampletext', 'sampletext', 'othertext', 'sampletext'], 'C': ['generation', 'Distribution', 'Transmission', 'generation', 'Distribution', 'Transmission'] }) # 步骤1:从A列提取kV对应的数值,转为数字类型,无匹配则为NaN df['kv_num'] = df['A'].str.extract(r'(\d+)(?:\s|\.)(?i:kv)', expand=False).astype(float) # 步骤2:定义修改C列的条件和对应值 conditions = [ # 条件1:B是sampletext,C不是generation,且kv_num≥110 (df['B'] == 'sampletext') & (df['C'] != 'generation') & (df['kv_num'] >= 110), # 条件2:B是sampletext,C不是generation,且kv_num<110 或 无有效数值 (df['B'] == 'sampletext') & (df['C'] != 'generation') & ((df['kv_num'] < 110) | pd.isna(df['kv_num'])) ] choices = ['Transmission', 'Distribution'] # 步骤3:应用条件修改C列,不满足条件则保留原值 df['C'] = np.select(conditions, choices, default=df['C']) # 可选:删除临时列kv_num df = df.drop('kv_num', axis=1) print(df)
示例输出
A B C 0 220kV变电站 sampletext generation 1 10kv线路 sampletext Distribution 2 35. Kv设备 sampletext Distribution 3 500伏变压器 sampletext generation 4 sample 110KV othertext Distribution 5 无kV标识 sampletext Distribution
关键说明
- 正则表达式简化:原正则调整为
r'(\d+)(?:\s|\.)(?i:kv)',用非捕获组减少冗余分组,不影响数字提取 astype(float)将提取的字符串转为数值类型,确保后续比较逻辑生效np.select清晰处理多条件分支,default参数直接保留原有值,完美覆盖"generation不修改"的需求
内容的提问来源于stack exchange,提问作者Gatarlo
相关产品推荐
相关产品推荐

