Pandas DataFrame分类数据转数值及列名转多列实现方法
处理Pandas分号分隔列转多值布尔列
先给出可复现的测试数据:
import pandas as pd df = pd.DataFrame({'id': [1, 2], 'Right': ['a;b;c', ''], 'Left': ['', 'c;e;d']})
步骤1:合并互斥的Right/Left列
因为每行的Right和Left只有一列有有效数据,先把两列合并成一列,方便后续处理:
# 替换空字符串为缺失值,再用另一列填充 df['values'] = df['Right'].replace('', pd.NA).fillna(df['Left'])
步骤2:拆分分号分隔的字符串为列表
把每个单元格的分号分隔字符串拆成值列表:
df['values'] = df['values'].str.split(';')
步骤3:展开列表为多行
用explode把列表中的每个值拆成单独一行,让每个id对应多个值行:
exploded_df = df.explode('values')
步骤4:生成布尔值哑变量
用get_dummies把每个值转换成布尔列,dtype=bool确保输出为布尔类型:
dummies = pd.get_dummies(exploded_df['values'], dtype=bool)
步骤5:按id聚合合并结果
把同一id的多个行聚合,只要值出现过就标记为True,最后重置索引恢复id列:
result = exploded_df[['id']].join(dummies).groupby('id').max().reset_index()
最终得到的result结构如下:
| id | a | b | c | d | e |
|---|---|---|---|---|---|
| 1 | True | True | True | False | False |
| 2 | False | False | True | True | True |
如果需要强制包含f列(即使没有对应数据),可以在生成哑变量时指定列范围:
dummies = pd.get_dummies(exploded_df['values'], dtype=bool, columns=['a','b','c','d','e','f'])
内容的提问来源于stack exchange,提问作者Gags08
相关产品推荐
相关产品推荐

