如何使用Pandas将DataFrame中某列的多值拆分为单独行?
如何使用Pandas将DataFrame中某列的多值拆分为单独行?
你现在遇到的应该是把DataFrame里某列的多值(比如逗号分隔的内容)拆成单独行的需求对吧?看你的示例数据,原来的Output列里是类似Doc, writeback这种多值组合,想要把每个值都对应原来的Category拆成独立行,这个场景挺常见的,我来帮你解决~
先说说你之前代码出错的原因:你写的auto_test_file.DataFrame(...)这里有问题,因为auto_test_file本身已经是一个DataFrame对象了,它并没有DataFrame()这个方法,所以才会抛出AttributeError: 'DataFrame' object has no attribute 'DataFrame'这个错误。
下面给你两种可行的解决方法,根据你的Pandas版本选就行:
方法一:用explode(推荐,Pandas 0.25及以上版本可用)
这是Pandas后来新增的非常方便的方法,一步到位:
# 先把Output列按', '(逗号加空格)拆分成列表 auto_test_file['Output'] = auto_test_file['Output'].str.split(', ') # 把列表中的每个元素拆成单独行,同时保留其他列的对应值 new_df = auto_test_file.explode('Output').reset_index(drop=True)
运行后就能得到你想要的结果,每个Output里的单独值都会对应原来的Category生成一行,最后reset_index(drop=True)是重置索引,让结果更规整。
方法二:用stack适配旧版本Pandas
如果你的Pandas版本比较旧,还没有explode方法,可以修正你原来的思路来实现:
# 将Category设为索引,拆分Output并展开为多列,再转成行 temp = auto_test_file.set_index('Category')['Output'].str.split(', ', expand=True).stack() # 整理成最终的DataFrame格式 new_df = temp.reset_index(level=0).rename(columns={0: 'Output'})
这个方法是先把Category作为索引,把拆分后的Output内容展开成多列,再通过stack()把列转成行,最后调整索引和列名得到目标结果。
两种方法都能实现你想要的效果,比如用你的示例数据,最终输出会是:
| Category | Output |
|---|---|
| Car | Doc |
| Car | writeback |
| Car | Trace |
| Car | dataview |
备注:内容来源于stack exchange,提问作者lostcoder
相关产品推荐
相关产品推荐

