熊猫在多列上爆炸

时间:2019-12-17 15:53:53

标签: python pandas dataframe explode

使用熊猫0.25.3,试图爆炸两列。

数据如下:

d1 = {'user':['user1','user2','user3','user4'],
      'paid':['Y','Y','N','N']
      'last_active':['11 Jul 2019','23 Sep 2018','08 Dec 2019','03 Mar 2018'],
      'col4':'data'}

我将其发送到如下所示的数据帧df=pd.DataFrame([d1],columns=d1.keys())

user                              paid              last_active                                                col4               
['user1','user2','user3','user4'] ['Y','Y','N','N'] ['11 Jul 2019','23 Sep 2018','08 Dec 2019','03 Mar 2018']  'data'

还有其他列,每个{'A':'B'}类型的东西都有一个值,但是我并不担心这些。

当我执行df.explode('user')时,它适用于该列,而其他列则相同,但是当我尝试执行df.explode(column=('user','paid','last_active')时,会出现以下错误:

KeyError: ('user','paid','last_active')

所以我想知道的是如何使用多列上的explode函数将其爆炸以获取以下df:

user     paid  last_active    col4
'user1'  'Y'   '11 Jul 2019'  'data'
'user2'  'Y'   '23 Sep 2018'  NaN
'user3'  'N'   '08 Dec 2019'  NaN
'user4'  'N'   '03 Mar 2018'  NaN

2 个答案:

答案 0 :(得分:2)

我猜您需要(请注意col4的数据差异,其中None如OP所述):

pd.DataFrame([[i] if not isinstance(i,list) else i 
             for i in d1.values()],index=d1.keys()).T

    user paid  last_active  col4
0  user1    Y  11 Jul 2019  data
1  user2    Y  23 Sep 2018  None
2  user3    N  08 Dec 2019  None
3  user4    N  03 Mar 2018  None

答案 1 :(得分:1)

熊猫没有多栏爆炸。有解决方法。一种简单的方法可能是:

df = pd.DataFrame({'A': [1, 2], 'B': [['a','b'], ['c','d']], 'C': [['z','y'], ['x','w']]})

A    B     C
--------------
1 [a, b] [z, y]
2 [c, d] [x, w]

##Logic for multi-col explode
list_cols = {'B','C'}
other_cols = list(set(df.columns) - set(list_cols))
exploded = [df[col].explode() for col in list_cols]
df2 = pd.DataFrame(dict(zip(list_cols, exploded)))
df2 = df[other_cols].merge(df2, how="right", left_index=True, right_index=True)

A B C
------
1 a z
1 b y
2 c x
2 d w