You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将DataFrame的多列表格列展开为行?

解决Pandas中多列逗号分隔字符串的行展开问题

原始数据

IDMSDS
6541500,10000,20000,3000060,365,730
1311500,10000,2000060,365,730
5981500,10000,20000,3000060,365,730

目标输出

IDMSDS
654150060
65410000365
65420000730
65430000NaN
131150060
13110000365
13120000730
598150060

问题分析

你之前的代码直接对整串字符串调用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)

关键步骤解释

  1. 拆分字符串:用split(',')将MS和DS列的逗号分隔文本拆分为独立元素的列表,这是解决核心问题的第一步。
  2. 对齐列表:使用zip_longest按位置配对两个列表,长度较短的列表末尾用pd.NA(Pandas标准缺失值)填充,比自定义的'Nan'字符串更符合数据规范。
  3. 生成子DataFrame:为每行的配对结果生成包含原始ID的小DataFrame,确保展开后ID与原始行一一对应。
  4. 合并结果:通过pd.concat将所有子DataFrame合并为最终的展开式DataFrame。

内容的提问来源于stack exchange,提问作者Divyansh Kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:43:15