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) )
另一答案

zipproductchain的组合可以实现行的分割。由于这涉及字符串,更重要的是没有数字计算,因此在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熊猫:爆炸多行的主要内容,如果未能解决你的问题,请参考以下文章

python 有用的熊猫片段

python 有用的熊猫片段

python 有用的熊猫片段

python 有用的熊猫片段

python 有用的熊猫片段

python 有用的熊猫片段