如何用高效Pandas方法拆分DataFrame字符串列并展开数据
如何用Pandas原生高效方法拆分字符串列并展开DataFrame
原DataFrame与目标结果
原DataFrame中sizes列是空格分隔的字符串,需要将每个字符串拆分为单独行,同时对应art1列的内容重复对应次数,得到目标结果:
原DataFrame代码:
import pandas as pd df = pd.DataFrame.from_dict({ 'art1':['n1','n2'], 'sizes':['35 36 37', '36 38'] }) print(df)
输出:
art1 sizes 0 n1 35 36 37 1 n2 36 38
目标结果代码:
df_result = pd.DataFrame.from_dict({ 'art1':['n1','n1','n1','n2','n2'], 'sizes':[35,36,37,36,38] }) print(df_result)
输出:
art1 sizes 0 n1 35 1 n1 36 2 n1 37 3 n2 36 4 n2 38
低效的手动循环实现
你当前的实现通过手动循环生成列表,效率较低:
lst_art = [] lst_sizes = [x.split() for x in df['sizes']] for i in range(len(lst_sizes)): for j in range(len(lst_sizes[i])): lst_art.append(df['art1'][i]) lst_sizes = sum(lst_sizes, []) df = pd.DataFrame({'art1':lst_art, 'sizes':lst_sizes}) print(df)
高效的Pandas原生方法
有两种Pandas原生方法可以高效完成这个转换:
方法1:str.split + explode(推荐,Pandas 0.25及以上版本)
explode是Pandas专门为展开列表类型列设计的函数,操作简洁且性能优异:
# 将sizes列按空格拆分为列表 df['sizes'] = df['sizes'].str.split() # 展开sizes列,自动对应重复art1的值 df_result = df.explode('sizes') # 可选:将sizes转为整数类型 df_result['sizes'] = df_result['sizes'].astype(int) print(df_result)
方法2:str.split + stack(兼容旧版Pandas)
如果你的Pandas版本低于0.25,可以用这种方式实现:
# 拆分sizes列为多列,再转为长格式 df_split = df['sizes'].str.split(expand=True) # 关联art1列,将多列合并为单列并去除空值 df_result = df[['art1']].join(df_split).melt(id_vars='art1', value_name='sizes') df_result = df_result.dropna(subset=['sizes']).drop(columns='variable').reset_index(drop=True) # 转为整数类型 df_result['sizes'] = df_result['sizes'].astype(int) print(df_result)
这两种方法都是Pandas的向量化操作,比手动循环效率提升显著,尤其是处理大数据量时优势更明显。
内容的提问来源于stack exchange,提问作者Константин Прудников
相关产品推荐
相关产品推荐

