在Pandas数据集中比较BRAND与my_Brand列并处理不匹配值
Pandas品牌列匹配与值迁移解决方案
需求说明
现有多列Pandas数据集,需实现以下逻辑:
- 将
BRAND列的每个条目与my_Brand列的所有条目进行比对 - 若
BRAND条目未在my_Brand的任何条目中出现:将该BRAND值移至NEW_DESCRIPTION列,同时清空当前BRAND列 - 若匹配成功:保持
BRAND列值不变,NEW_DESCRIPTION列内容也不变
你的尝试代码问题
你写的列表推导式逻辑完全不符合需求:
df_Brand['BRAND'] = [y if x == '' else x for x,y in zip(df_Brand['BRAND'],df_Brand['my_Brand'])]
这段代码只是把同一行中BRAND为空的值替换成该行的my_Brand值,没有实现跨列全量比对的核心逻辑。
可行解决方案代码
以下是符合需求的完整代码,包含示例数据和详细逻辑:
import pandas as pd # 构建示例数据集(和你提供的结构一致) data = { 'BRAND': ['USE 615880.ATT GROUND ROD', 'COMMSCOPE', 'ELECTRO-WIRE INC.', 'GALTRONICS'], 'NEW_DESCRIPTION': ['HOISTING GRIP FOR PWRT-608 POWER CABLE, CEQ.7...', '', 'TELCOFLEX II 6 AWG L2 GREEN, KS24194-SOUTHWIR.', '12 X 12\' GRIP SPAN ICE BRIDGE'], 'my_Brand': ['123EWIRELESS', '3M Products', 'COMMSCOPE', 'o-m6 Technologies'] } df = pd.DataFrame(data) # 1. 预处理:将NEW_DESCRIPTION的空值/NaN转为空字符串,避免拼接出错 df['NEW_DESCRIPTION'] = df['NEW_DESCRIPTION'].fillna('').astype(str) # 2. 提取my_Brand列的所有有效品牌,转为集合(集合查找速度远快于列表) valid_brand_set = set(df['my_Brand'].dropna().unique()) # 3. 批量处理每一行数据 for idx, row in df.iterrows(): current_brand = row['BRAND'] # 检查当前品牌是否在有效品牌集合中 if current_brand not in valid_brand_set: # 拼接原描述和品牌值(原描述非空时加空格分隔) updated_desc = f"{row['NEW_DESCRIPTION']} {current_brand}".strip() # 更新列值:清空BRAND,替换NEW_DESCRIPTION df.loc[idx, 'BRAND'] = '' df.loc[idx, 'NEW_DESCRIPTION'] = updated_desc # 输出处理后的结果 print(df)
代码关键说明
- 用集合存储有效品牌:因为集合的成员查找操作是O(1)时间复杂度,比列表的O(n)快很多,适合数据量较大的场景
- 预处理空值:避免拼接
NEW_DESCRIPTION时出现NaN或异常字符串 - 逐行处理逻辑:直观易懂,适合新手理解,若数据量极大可改用矢量化操作提升效率
处理后示例结果
| BRAND | NEW_DESCRIPTION | my_Brand |
|---|---|---|
| HOISTING GRIP FOR PWRT-608 POWER CABLE, CEQ.7... USE 615880.ATT GROUND ROD | 123EWIRELESS | |
| COMMSCOPE | 3M Products | |
| ELECTRO-WIRE INC. | TELCOFLEX II 6 AWG L2 GREEN, KS24194-SOUTHWIR. | COMMSCOPE |
| 12 X 12' GRIP SPAN ICE BRIDGE GALTRONICS | o-m6 Technologies |
内容的提问来源于stack exchange,提问作者Sanjeet Kumar
相关产品推荐
相关产品推荐

