如何统计Pandas DataFrame中Equipment字段值出现次数并生成对应列
解决方法
你的核心需求是把逗号分隔的Equipment字段拆分为独热编码列(存在为1,不存在为0),原代码的问题在于错误地对index列执行了explode,且未处理字符串中的空格(比如" Android"带空格会生成错误的列名)。以下是两种正确实现方式:
方法一:拆分展开后生成哑变量
import pandas as pd data = {'Equipment': ['ABS, Android, Zentralverriegelung', 'Xenon, ABS, Apple', 'Android, Hupe, Blinker', 'Radio, CD', '', 'ABS, Android, Zentralverriegelung'], 'Col1': ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa'], 'Col2': ['bbb', 'bbb', 'bbb', 'bbb', 'bbb', 'bbb'], 'Col3': ['ccc', 'ccc', 'ccc', 'ccc', 'ccc', 'ccc'], 'Col4': ['ddd', 'ddd', 'ddd', 'ddd', 'ddd', 'ddd'], 'Col5': ['eee', 'eee', 'eee', 'eee', 'eee', 'eee'], } df = pd.DataFrame(data) # 拆分Equipment为多列并展开,同时去除每个元素的空格 exploded = df['Equipment'].str.split(',', expand=True).stack().str.strip() # 过滤空字符串(处理Equipment为空的情况) exploded = exploded[exploded != ''] # 生成哑变量后按原索引分组求和,同一行的同一Equipment只会出现一次,求和结果为1 dummies = pd.get_dummies(exploded).groupby(level=0).sum() # 合并原表(去掉Equipment字段)和哑变量列,缺失值填充为0并转为整数 result = pd.concat([df.drop('Equipment', axis=1), dummies], axis=1).fillna(0).astype(int) print(result)
方法二:简洁的字符串处理+get_dummies
import pandas as pd data = {'Equipment': ['ABS, Android, Zentralverriegelung', 'Xenon, ABS, Apple', 'Android, Hupe, Blinker', 'Radio, CD', '', 'ABS, Android, Zentralverriegelung'], 'Col1': ['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa'], 'Col2': ['bbb', 'bbb', 'bbb', 'bbb', 'bbb', 'bbb'], 'Col3': ['ccc', 'ccc', 'ccc', 'ccc', 'ccc', 'ccc'], 'Col4': ['ddd', 'ddd', 'ddd', 'ddd', 'ddd', 'ddd'], 'Col5': ['eee', 'eee', 'eee', 'eee', 'eee', 'eee'], } df = pd.DataFrame(data) # 清理Equipment字段:拆分后去除空格,再重新用逗号拼接 df['Equipment_clean'] = df['Equipment'].apply(lambda x: ','.join([item.strip() for item in x.split(',') if item.strip()])) # 直接生成独热编码列 dummies = df['Equipment_clean'].str.get_dummies(sep=',') # 合并原表和哑变量列,清理中间字段 result = pd.concat([df.drop(['Equipment', 'Equipment_clean'], axis=1), dummies], axis=1) print(result)
两种方法最终都会生成包含Col1-Col5以及所有Equipment值对应列的DataFrame,每个Equipment列的值为1(该行包含该设备)或0(不包含)。
内容的提问来源于stack exchange,提问作者ioSven
相关产品推荐
相关产品推荐

