如何优雅拆分Pandas DataFrame中含可迭代对象的列?
优雅拆分Pandas列中的序列数据为多列
嘿,这个需求我太有共鸣了!其实Pandas本身就有简洁的方法能实现你想要的类似splittuple的效果,不用像你之前的两种方式那样绕路。
最贴近你设想的简洁写法
直接用pd.Series包装你的序列结果,就能直接赋值给新列(包括覆盖原有列),完美贴合你想要的语法逻辑:
from pandas import DataFrame, Series data = DataFrame({"label": [a for a in "abcde"], "x": range(5)}) # 直接赋值,覆盖原有x列并新增x2列 data[["x", "x2"]] = data["x"].apply(lambda x: Series([x, x*2])) print(data)
输出完全符合你的预期:
label x x2 0 a 0 0 1 b 1 2 2 c 2 4 3 d 3 6 4 e 4 8
更高效的大数据量版本
如果你的数据集规模较大,apply(pd.Series)的逐行构造开销会比较明显,这时候可以用tolist()转成嵌套列表后直接构造DataFrame,同时指定索引避免匹配问题:
from pandas import DataFrame data = DataFrame({"label": [a for a in "abcde"], "x": range(5)}) data[["x", "x2"]] = DataFrame( data["x"].apply(lambda x: (x, x*2)).tolist(), index=data.index )
这个方法的执行速度比apply(pd.Series)快很多,尤其适合处理百万级以上的数据集。
对比你现有方式的优势
- 你的方式一需要先删除原有列再合并,步骤繁琐,还容易因索引错位导致数据混乱;
- 方式二通过字符串中转的思路完全没必要,不仅效率低下,还可能在数据包含特殊字符时出现解析错误;
- 上面的两种方法都是原地直接赋值,逻辑清晰直观,和你设想的
splittuple(expand=True)用法几乎一致,代码可读性拉满。
内容的提问来源于stack exchange,提问作者Vladimir Gorshkov
相关产品推荐
相关产品推荐

