最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题。找了一番资料后成功了,记录一下。
1. 如果需要爆炸的只有一列:
1
2
3
4
5
6
|
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)
1
2
3
4
5
6
7
|
df.explode( 'B' ) A B 0 1 1 1 1 2 2 2 1 3 2 2 |
2. 如果需要爆炸的有2列及以上
1
2
3
4
5
6
|
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 ] |
则可以用写一个方法,如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 |
补充知识:pandas:一列分解成多列 series.str.split(',',expand=True);pyspark 一列分解成多列
源shuju
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
question_id id 0 17576 70391 , 70394 1 17576 70391 , 70392 , 70393 , 70394 2 17576 70391 , 70392 3 40430 155032 , 155033 , 155034 4 40430 155032 , 155033 , 155034 , 155035 5 40430 155033 , 155034 , 155035 6 40430 155032 , 155035 7 40430 155034 , 155035 8 40430 155032 , 155034 9 40430 155032 , 155034 , 155035 10 40430 155033 , 155034 11 40430 155032 , 155033 12 40430 155033 , 155035 13 40430 155032 , 155033 , 155035 |
pandas solution
df.join(df['id'].str.split(',',expand=True)
result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
0 1 2 3 0 70391 70394 None None 1 70391 70392 70393 70394 2 70391 70392 None None 3 155032 155033 155034 None 4 155032 155033 155034 155035 5 155033 155034 155035 None 6 155032 155035 None None 7 155034 155035 None None 8 155032 155034 None None 9 155032 155034 155035 None 10 155033 155034 None None 11 155032 155033 None None 12 155033 155035 None None 13 155032 155033 155035 None |
#注意expand=True
df.join(df['id'].str.split(',',expand=True))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
question_id id 0 1 2 3 0 17576 70391 , 70394 70391 70394 None None 1 17576 70391 , 70392 , 70393 , 70394 70391 70392 70393 70394 2 17576 70391 , 70392 70391 70392 None None 3 40430 155032 , 155033 , 155034 155032 155033 155034 None 4 40430 155032 , 155033 , 155034 , 155035 155032 155033 155034 155035 5 40430 155033 , 155034 , 155035 155033 155034 155035 None 6 40430 155032 , 155035 155032 155035 None None 7 40430 155034 , 155035 155034 155035 None None 8 40430 155032 , 155034 155032 155034 None None 9 40430 155032 , 155034 , 155035 155032 155034 155035 None 10 40430 155033 , 155034 155033 155034 None None 11 40430 155032 , 155033 155032 155033 None None 12 40430 155033 , 155035 155033 155035 None None 13 40430 155032 , 155033 , 155035 155032 155033 155035 None |
1
2
3
4
5
6
|
pyspark solution tdf = df.select(F.split(df. id , ',' ).alias( 'ss' ), 'question_id' , 'count_num' ) tdf.sort( 'question_id' ).show() res = tdf.select(F.explode(tdf.ss).alias( 'new' ), 'question_id' , 'count_num' ) res.sort( 'question_id' ).show() res.groupBy( 'question_id' , 'new' ). sum ().sort( 'question_id' ).show() |
result
以上这篇Python pandas 列转行操作详解(类似hive中explode方法)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/m0_37773338/article/details/103754807