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

作者:geekingLi 时间:2021-02-18 15:12:31 

最近在工作上用到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

补充知识:pandas:一列分解成多列 series.str.split(',',expand=True);pyspark 一列分解成多列

源shuju


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


  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))


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

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方法)

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

来源:https://blog.csdn.net/m0_37773338/article/details/103754807

标签:Python,pandas,列转行,hive,explode
0
投稿

猜你喜欢

  • MySQL优化之使用连接(join)代替子查询

    2024-01-25 18:26:33
  • Laravel框架实现利用监听器进行sql语句记录功能

    2024-05-13 09:53:49
  • 基于asyncio 异步协程框架实现收集B站直播弹幕

    2021-07-14 19:34:40
  • flask框架jinja2模板与模板继承实例分析

    2023-08-26 22:21:34
  • python 图片验证码代码

    2023-07-22 00:33:19
  • Python RawString与open文件的newline换行符遇坑解决

    2021-08-28 20:37:41
  • Python魔法方法 容器部方法详解

    2021-02-05 19:25:43
  • 除Console.log()外更多的Javascript调试命令

    2023-08-12 23:31:17
  • Python Opencv轮廓常用操作代码实例解析

    2023-01-03 08:46:59
  • mysql批量更新多条记录的同一个字段为不同值的方法

    2024-01-27 20:21:49
  • php中用socket模拟http中post或者get提交数据的示例代码

    2023-11-19 00:45:21
  • 碰到MySQL无法启动1067错误问题解决方法

    2024-01-18 09:16:47
  • Yolov5更换BiFPN的详细步骤总结

    2023-01-17 02:51:22
  • vue中的mixins混入使用方法

    2023-07-02 17:01:47
  • python编程实现希尔排序

    2022-11-05 22:21:57
  • Python实现截图生成符合markdown的链接

    2021-07-09 10:18:22
  • XML to DDL的项目关键:与数据库同步

    2008-05-29 14:19:00
  • Microsoft VBScript 运行时错误 错误800a0005 无效的过程调用或参数

    2010-03-25 21:51:00
  • Java实现从数据库导出大量数据记录并保存到文件的方法

    2024-01-16 09:47:37
  • JavaScript 题型问答有答案参考

    2024-04-19 10:44:41
  • asp之家 网络编程 m.aspxhome.com