DataFrame列按';'分割字符串计数异常:代码返回0而非预期6
问题分析与解决方案
原代码错误原因
你的代码逻辑完全偏离需求:
str.split(';')[0]是取分割后的第一个元素,而非获取所有分割后的元素列表- 后续的
count('Control Stores')是在这个单个元素中统计子串Control Stores的出现次数,这和你需要的「分割后元素数量」毫无关系,所以返回0。
正确实现方式
方法1:简洁版(满足基础需求)
直接利用Pandas字符串方法分割后取长度,同时处理NaN值:
import pandas as pd # 新增计数列 final_input_optimization['Control Store Count'] = ( final_input_optimization['Control Stores'] .str.split(';') # 按分号分割字符串 .str.len() # 获取分割后的元素数量 .fillna(1) # NaN值填充为1 )
该方法适配核心需求:
- 单个值分割后长度为1,直接返回1
- NaN值被填充为1
- 多值分割后返回对应元素数量(比如你预期的6)
方法2:灵活版(处理空元素场景)
如果数据存在末尾分号、连续分号导致的空元素(例如"A;;B"),可以用apply自定义函数过滤无效值:
def count_stores(x): if pd.isna(x): return 1 # 分割字符串 parts = x.split(';') # 过滤空字符串和纯空格的元素 valid_parts = [part for part in parts if part.strip()] # 过滤后为空则返回1,否则返回有效元素数量 return len(valid_parts) if valid_parts else 1 final_input_optimization['Control Store Count'] = final_input_optimization['Control Stores'].apply(count_stores)
内容的提问来源于stack exchange,提问作者Mihika Malhotra
相关产品推荐
相关产品推荐

