如何在 Pandas 中将多个逗号分隔的列表列同时展开为多行

14次阅读

如何在 Pandas 中将多个逗号分隔的列表列同时展开为多行

本文介绍使用 `str.split()` 和 `explode()` 高效展开多个字符串型列表列(如 “ms” 和 “ds”),实现按元素一一配对、长度不齐时自动补 `none` 的行扩展操作。

数据分析中,常遇到将多列字符串形式的逗号分隔值(如 “1500,10000,20000”)同步展开为独立行的需求。关键在于:既要分别拆分各列,又要保持对应位置的元素配对(如第1个 MS 对应第1个 DS),且需处理列间长度不一致的情况(自动填充 None)

pandas 提供了简洁高效的解决方案:先用 str.split(“,”) 将每列转为 python 列表,再通过 zip_longest 配对并生成元组列表,最后利用 explode() 展开。完整步骤如下:

from itertools import zip_longest import pandas as pd  # 示例数据 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"] })  # 步骤1:将 MS 和 DS 列字符串按逗号拆分为列表 df[["MS", "DS"]] = df[["MS", "DS"]].apply(lambda x: x.str.split(","), axis=1)  # 步骤2:对每一行,用 zip_longest 配对两个列表(短者用 None 填充) df["paired"] = df.apply(lambda row: list(zip_longest(row["MS"], row["DS"])), axis=1)  # 步骤3:explode 展开 paired 列,再拆解元组为独立列 df = df.explode("paired") df[["MS", "DS"]] = pd.DataFrame(df["paired"].tolist(), index=df.index)  # 可选:清理中间列,并确保数据类型正确(如转为数值) df = df.drop(columns=["paired"]).astype({"MS": "float", "DS": "float"})

输出效果

  • 每行 ID 重复出现多次,次数等于该行最长列表的长度;
  • MS 和 DS 按原始顺序一一对应,不足项自动补 None(即 NaN);
  • 最终列类型可统一转换为数值型,便于后续计算。

⚠️ 注意事项

  • zip_longest 来自 itertools,务必导入;
  • explode() 要求目标列为 list/tuple 类型,不可直接对字符串列使用;
  • 若原始数据含空格(如 “1500, 10000″),建议在 str.split() 后链式调用 .str.strip() 清洗;
  • 性能敏感场景下,避免对大 DataFrame 多次 apply;可考虑 pd.concat + map 等向量化替代方案。

此方法逻辑清晰、代码简洁,是处理多列同步展开的标准实践。

text=ZqhQzanResources