Python熊猫:爆炸多行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python熊猫:爆炸多行相关的知识,希望对你有一定的参考价值。
我必须在数据框下方:
import pandas as pd
a = pd.DataFrame([{"name": "John",
"item" : "item1||item2||item3",
"itemVal" : "item1Val||item2Val||item3Val"},
{"name" : "Tom",
"item":"item4",
"itemVal" : "item4Val"
}
])
数据帧是这样的:
name item itemVal
John item1||item2||item3 item1Val||item2Val||item3Val
Tom item4 item4Val
我想将行爆炸成多行,这样它就会变成这样(注意item
和它的itemVal
需要匹配)。
name item itemVal
John item1 item1Val
John item2 item2Val
John item3 item3Val
Tom item4 item4Val
我在这里查看了其他答案:
Split (explode) pandas dataframe string entry to separate rows
pandas: How do I split text in a column into multiple rows?
但是这些作品只在一个专栏上发表。如何使它在多列上工作?我正在使用Pandas 1.0.1和Python 3.8
答案
a = a.apply(lambda x: [v.split('||') for v in x]).apply(pd.Series.explode)
print(a)
打印:
name item itemVal
0 John item1 item1Val
0 John item2 item2Val
0 John item3 item3Val
1 Tom item4 item4Val
编辑:如果只想拆分选定的列,则可以执行以下操作:
exploded = a[['item', 'itemVal']].apply(lambda x: [v.split('||') for v in x]).apply(pd.Series.explode)
print( pd.concat([a['name'], exploded], axis=1) )
另一答案
zip,product和chain的组合可以实现行的分割。由于这涉及字符串,更重要的是没有数字计算,因此在Python中,您应该比在Pandas中运行它获得更快的速度。
from itertools import product,chain
combine = chain.from_iterable
#pair item and itemval columns
merge = zip(df.item,df.itemVal)
#pair the entires from the splits of item and itemval
merge = [zip(first.split("||"),last.split("||")) for first, last in merge]
#create a cartesian product with the name column
merger = [product([ent],cont) for ent, cont in zip(df.name,merge)]
#create ur exploded values
res = [(ent,*cont) for ent, cont in combine(merger)]
pd.DataFrame(res,columns=['name','item','itemVal'])
name item itemVal
0 John item1 item1Val
1 John item2 item2Val
2 John item3 item3Val
3 Tom item4 item4Val
以上是关于Python熊猫:爆炸多行的主要内容,如果未能解决你的问题,请参考以下文章