Python pandas 列转行操作(类似hive中explode方法)

最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题。找了一番资料后成功了,记录一下。

1. 如果需要爆炸的只有一列:

df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]})
df
Out[1]: 
   A       B
0  1  [1, 2]
1  2  [1, 2]

 如果要爆炸B这一列,可以直接用explode方法(前提是你的pandas的版本要高于或等于0.25)

df.explode('B')

       A  B
    0  1  1
    1  1  2
    2  2  1
    3  2  2

2. 如果需要爆炸的有2列及以上 

df=pd.DataFrame({'A':[1,2],'B':[[1,2],[3,4]],'C':[[1,2],[3,4]]})
df
Out[592]: 
   A       B       C
0  1  [1, 2]  [1, 2]
1  2  [3, 4]  [3, 4]

则可以用写一个方法,如下代码:

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')


unnesting(df,['B','C'])
Out[2]: 
   B  C  A
0  1  1  1
0  2  2  1
1  3  3  2
1  4  4  2

文章参考:

https://stackoverflow.com/questions/53218931/how-to-unnest-explode-a-column-in-a-pandas-dataframe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值