Python Pandas实战:拆分含缺失元素的单列为三列
解决Pandas拆分含不同长度元素字符串的列对齐问题
先看原始数据(animals.csv):
Row,Animal 1,big green cat 2,small lizard 3,gigantic blue bunny
我们要把Animal列拆成Size、Color、Animal三列,最终期望结果:
Row,Size,Color,Animal 1,big,green,cat 2,small, ,lizard 3,gigantic,blue,bunny
直接用str.split('\s', expand=True)会导致两元素行的第三列为None,而非中间的Color列留空;指定列名时还会触发ValueError,因为列长度不匹配。下面给出两种实用的解决方法:
方法一:从右拆分先提取Animal,再处理前序部分
这个思路更贴合需求逻辑:先把每个字符串的最后一个词单独拆出来作为最终的Animal,剩下的部分再拆成Size和Color,没有颜色的行自动留空。
import pandas as pd # 读取数据 df = pd.read_csv('animals.csv') # 第一步:从右侧拆分1次,把最后一个词作为新的Animal列,前面的内容存到Temp列 df[['Temp', 'Animal']] = df['Animal'].str.rsplit('\s', maxsplit=1, expand=True) # 第二步:拆分Temp列成Size和Color,缺失的Color用空字符串填充 df[['Size', 'Color']] = df['Temp'].str.split('\s', maxsplit=1, expand=True).fillna('') # 清理临时列,调整列顺序 df = df.drop('Temp', axis=1)[['Row', 'Size', 'Color', 'Animal']] # 查看结果 print(df.to_csv(index=False))
输出正好符合预期:
Row,Size,Color,Animal 1,big,green,cat 2,small,,lizard 3,gigantic,blue,bunny
方法二:拆分后通过条件判断分配列值
如果习惯从左到右拆分,可以先拆成最多3列,再通过条件判断把缺失的Color列补空,同时调整Animal列的取值:
import pandas as pd df = pd.read_csv('animals.csv') # 从左拆分,最多拆2次,得到3列 split_cols = df['Animal'].str.split('\s', maxsplit=2, expand=True) # 分配Size列(第一部分) df['Size'] = split_cols[0] # 分配Color列:如果第三部分存在,就取第二部分;否则留空 df['Color'] = split_cols[1].where(split_cols[2].notna(), '') # 分配Animal列:如果第三部分存在就取第三部分,否则取第二部分 df['Animal'] = split_cols[2].fillna(split_cols[1]) # 调整列顺序 df = df[['Row', 'Size', 'Color', 'Animal']] print(df.to_csv(index=False))
这个方法同样能得到符合要求的结果。
内容的提问来源于stack exchange,提问作者Leia_Organa
相关产品推荐
相关产品推荐

