在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
相关产品推荐
相关产品推荐

