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

在Pandas DataFrame中按条件拆分逗号分隔列值生成新行并保留其余列值

我来帮你搞定这个需求!看你的示例,核心是当var1里的逗号数≥2时,把每个前缀和最后一个元素配对生成新行,同时保留其他列,而逗号少的就原样保留对吧?直接上代码和解释:

步骤1:准备示例数据(如果你的数据已经存在可以跳过)

先构造和你示例一致的DataFrame:

import pandas as pd

data = {
    'var1': ['a,b,c,d', 'a,b,c,d', 'a,b,c,d', 'a,b,c,d', 'e,f,g', 'e,f,g', 'e,f,g', 'h,i'],
    'var2': [1,1,1,1,2,2,2,3],
    'var3': ['X1', 'X2', 'X3', '', 'Y1', 'Y2', '', 'Z1']
}
df = pd.DataFrame(data)

步骤2:定义处理函数

写一个函数来处理每个var1的字符串,判断逗号数量后生成对应的新字符串列表:

def process_var1(s):
    parts = s.split(',')
    # 逗号数量 = 拆分后的元素总数 - 1
    if len(parts) - 1 >= 2:
        last_part = parts[-1]
        # 把每个前面的元素和最后一个元素拼接成新字符串
        return [f"{p},{last_part}" for p in parts[:-1]]
    else:
        # 逗号不够2个,直接返回原字符串的列表(方便后续展开)
        return [s]

步骤3:处理并展开数据

用apply处理var1列生成列表,再用explode把列表拆成独立行,最后过滤掉var3为空的行(和你的示例输出一致):

# 给每个var1生成对应的字符串列表
df['var1'] = df['var1'].apply(process_var1)
# 把列表元素拆分成单独的行,自动保留其他列的对应值
result_df = df.explode('var1').reset_index(drop=True)
# 过滤掉var3为空的记录(如果不需要这一步可以直接删除)
result_df = result_df[result_df['var3'] != ''].reset_index(drop=True)

查看最终结果

运行后打印result_df,就得到你想要的输出:

print(result_df)

输出结果:

var1  var2 var3
0  a,d     1   X1
1  b,d     1   X2
2  c,d     1   X3
3  e,g     2   Y1
4  f,g     2   Y2
5  h,i     3   Z1

关键逻辑说明

  • 用split(',')拆分字符串后,通过len(parts)-1判断逗号数量,比直接用str.count(',')更稳妥(避免字符串中有特殊情况干扰计数)。
  • explode是Pandas专门用来展开列表型元素的工具,能完美保留其他列的对应值,不用手动循环处理。
  • 最后过滤var3为空的行是匹配你的示例输出,如果你需要保留这些行,直接去掉过滤步骤即可。

内容的提问来源于stack exchange,提问作者Vishnubhatla Saivamsi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:42:42