
本文介绍使用 `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 等向量化替代方案。
此方法逻辑清晰、代码简洁,是处理多列同步展开的标准实践。










