如何在Python中将DataFrame的多列表格列展开为行?
解决Pandas中多列逗号分隔字符串的行展开问题
原始数据
| ID | MS | DS |
|---|---|---|
| 654 | 1500,10000,20000,30000 | 60,365,730 |
| 131 | 1500,10000,20000 | 60,365,730 |
| 598 | 1500,10000,20000,30000 | 60,365,730 |
目标输出
| ID | MS | DS |
|---|---|---|
| 654 | 1500 | 60 |
| 654 | 10000 | 365 |
| 654 | 20000 | 730 |
| 654 | 30000 | NaN |
| 131 | 1500 | 60 |
| 131 | 10000 | 365 |
| 131 | 20000 | 730 |
| 598 | 1500 | 60 |
问题分析
你之前的代码直接对整串字符串调用zip_longest,没有先将逗号分隔的字符串拆分为元素列表,导致整个字符串被当作单个元素处理,生成了[('1500,10000,20000,30000', '60,365,730')]这类不符合预期的结果。
正确实现
import pandas as pd from itertools import zip_longest # 初始化原始DataFrame(已有可跳过此步骤) df = pd.DataFrame({ 'ID': [654, 131, 598], 'MS': ['1500,10000,20000,30000', '1500,10000,20000', '1500,10000,20000,30000'], 'DS': ['60,365,730', '60,365,730', '60,365,730'] }) def expand_row(row): # 拆分逗号分隔字符串为元素列表 ms_items = row['MS'].split(',') ds_items = row['DS'].split(',') # 对齐两个列表,不足位填充Pandas标准缺失值 paired_items = list(zip_longest(ms_items, ds_items, fillvalue=pd.NA)) # 生成当前ID对应的拆分后子DataFrame return pd.DataFrame(paired_items, columns=['MS', 'DS']).assign(ID=row['ID']) # 合并所有行的拆分结果 expanded_df = pd.concat(df.apply(expand_row, axis=1).tolist(), ignore_index=True) # 可选:转换为数值类型 expanded_df = expanded_df.astype({'MS': int, 'DS': float}) print(expanded_df)
关键步骤解释
- 拆分字符串:用
split(',')将MS和DS列的逗号分隔文本拆分为独立元素的列表,这是解决核心问题的第一步。 - 对齐列表:使用
zip_longest按位置配对两个列表,长度较短的列表末尾用pd.NA(Pandas标准缺失值)填充,比自定义的'Nan'字符串更符合数据规范。 - 生成子DataFrame:为每行的配对结果生成包含原始
ID的小DataFrame,确保展开后ID与原始行一一对应。 - 合并结果:通过
pd.concat将所有子DataFrame合并为最终的展开式DataFrame。
内容的提问来源于stack exchange,提问作者Divyansh Kumar Singh
相关产品推荐
相关产品推荐

