本文介绍使用 `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"})✅ 输出效果:
⚠️ 注意事项:
此方法逻辑清晰、代码简洁,是处理多列同步展开的标准实践。