pandas如何优雅的列转行及行转列详解

目录
  • 一、列转行
    • 1、背景描述
    • 2.方法描述
      • 2.1 方法1
      • 2.2 方法2
      • 2.3 方法3
      • 2.4 方法4
    • 3 思考与总结
    • 4 思维延伸
      • 4.1 例子1
      • 4.2 例子2
  • 二、行转列
    • 1.准备数据
    • 2.行转列实现
      • 2.1 方法1
      • 2.2 方法2
      • 2.3 方法3
    • 3.思考与总结
  • 三、行列转换(长宽互换)
  • 总结

一、列转行

1、背景描述

在日常处理数据过程中,你们可能会经常遇到这种类型的数据:

而我们用pandas进行统计分析时,往往需要将结果转换成以下类型的数据:

2.方法描述

准备数据

df = pd.DataFrame({'姓名': ['A','B','C'],
                  '英语':[90,60,70],
                  '数学':[80,98,80],
                  '语文':[85,90,75]})

这个实现的方法有多种形式,这里集中进行展示

2.1 方法1

tmp=df.set_index(['姓名']).stack()
tmp2=tmp.rename_axis(index=['姓名','科目'])
tmp2.name='分数'
tmp2.reset_index()

2.2 方法2

tmp=df.set_index(['姓名']).stack()
tmp.index.names=['姓名','科目']
tmp.reset_index(name='分数')

2.3 方法3

tmp=df.set_index(['姓名']).stack().reset_index()
tmp.columns=['姓名','科目','分数']

2.4 方法4

tmp=pd.melt(df,id_vars='姓名',var_name='科目',value_name='分数')

3 思考与总结

通过上述的对比,相信各位已经明白其中的厉害之处了,下面就来重点讲解一下melt这个函数。melt函数共有以下几个:

frame: 需要处理的数据帧id_vars: 不需要做列转行处理的字段,如果不设置该字段则默认会对所有列进行处理value_vars: 需要做列转行的字段,不指定则不处理var_name: 列转行处理后,生成字段列,对列转行之前的字段名称进行重命名value_name: 列转行处理后,生成数值列,对列转行之前的数值进行命名col_level: 指定具体的列名等级,通常在有多级列名时使用。

4 思维延伸

4.1 例子1

转换前:

转换后:

实现的1种方法:

#准备数据
df2 = pd.DataFrame({'姓名': ['A', 'B', 'C'],
                    '班级':[1,2,1],
                    '期中考试-英语': [90, 60, 70],
                    '期中考试-数学': [80, 98, 80],
                    '期中考试-语文': [85, 90, 75],
                    '期末考试-英语': [92, 63, 76],
                    '期末考试-数学': [85,100, 89],
                    '期末考试-语文': [87, 91, 80]})
#实现部分
t1=pd.melt(df2, id_vars=['姓名','班级'],  var_name='科目', value_name='分数')
t2=t1.set_index(['姓名','班级','分数'])['科目'].str.split('-',expand=True).reset_index()
t2.set_index(['姓名','班级',0,1]).unstack().reset_index().rename_axis()
t3=t2.set_index(['姓名','班级',0,1]).unstack()
t3.columns=t3.columns.droplevel(0)
result=t3.rename_axis(columns=None).reset_index().rename(columns={0:'考试类型'})
result

4.2 例子2

转换前:

转换后:

实现方法举例:

pd.lreshape(df2,{'英语':['期中考试-英语','期末考试-英语'],
                '数学':['期中考试-数学','期末考试-数学'],
                '语文':['期中考试-语文','期末考试-语文']})

二、行转列

在一中,我们已经完成了对于列转行的任务,即将本文一中的多列df转为tmp,那现在假如需要进行列转行又该如何操作呢?

1.准备数据

tmp=pd.DataFrame({'姓名':['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
             '科目':['英语', '英语', '英语', '数学', '数学', '数学', '语文', '语文', '语文'],
             '分数':[90, 60, 70, 80, 98, 80, 85, 90, 75]})
tmp

2.行转列实现

2.1 方法1

tmp2=tmp.set_index(['姓名','科目'])['分数'].unstack()
df=tmp2.rename_axis(columns=None).reset_index()

2.2 方法2

tmp2=tmp.set_index(['姓名','科目'])['分数'].unstack()
df=tmp2.rename_axis(columns=None).reset_index()

2.3 方法3

df=tmp.pivot(index='姓名',columns='科目',values='分数').rename_axis(columns=None).reset_index()

3.思考与总结

从行转列的例子中,我们可以发现核心的函数是unstack。unstack是将多重索引形式的数据,转换为标准表格形式的数据,unstack主要由两个参数组成:

level :要取消堆叠的索引级别,可以传递级别名称 。默认参数为-1,例子中为科目,即最后一个索引fill_value :如果取消堆叠后有缺失数据,会以固定字符进行填充。

三、行列转换(长宽互换)

(1) stack和unstack

California   2000 33871648 

                2010 37253956 

New York  2000 18976457 

                2010 19378102 

Texas        2000 20851820 

                2010 25145561 

以上述数据为例

new_df = pop.unstack()

new_df

unstack() 方法可以快速将一个多级索引的 Series 转化为普通索引的 DataFrame,stack则可以实现将列转化为索引。

来看个实际的行列互换的例子

列转行

import pandas as pd

df = pd.read_csv('data/pew.csv')

df.head(10)

df = df.set_index('religion') #先把religion设为索引

df = df.stack() #将列转化为二级索引

df.index = df.index.rename('income', level=1) #二级索引命命

df.name = 'frequency'

df = df.reset_index() #将索引转化为Series

df.head(10)

上述转化,可以看作是宽表转长表,很好记忆,将一组具有相同特征的列,转化成一列,自然就变窄了,同时为了一一对应,需要和其他列做组合,就会变长。

总结

到此这篇关于pandas如何优雅的列转行及行转列的文章就介绍到这了,更多相关pandas列转行及行转列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pandas.DataFrame的pivot()和unstack()实现行转列

    示例:有如下表需要进行行转列: 代码如下: # -*- coding:utf-8 -*- import pandas as pd import MySQLdb from warnings import filterwarnings # 由于create table if not exists总会抛出warning,因此使用filterwarnings消除 filterwarnings('ignore', category = MySQLdb.Warning) from sqlalchemy im

  • 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

  • pandas如何优雅的列转行及行转列详解

    目录 一.列转行 1.背景描述 2.方法描述 2.1 方法1 2.2 方法2 2.3 方法3 2.4 方法4 3 思考与总结 4 思维延伸 4.1 例子1 4.2 例子2 二.行转列 1.准备数据 2.行转列实现 2.1 方法1 2.2 方法2 2.3 方法3 3.思考与总结 三.行列转换(长宽互换) 总结 一.列转行 1.背景描述 在日常处理数据过程中,你们可能会经常遇到这种类型的数据: 而我们用pandas进行统计分析时,往往需要将结果转换成以下类型的数据: 2.方法描述 准备数据 df =

  • MySQL中列转行和行转列总结解决思路

    目录 引言 列转行 行转列 总结 引言 在学习sql中遇到了列转行和行转列的题目,这里总结一下如何在对应的情景下解决不同的题目: 列转行 创建一个表stu_score_01: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for stu_score_01 -- ---------------------------- DROP TABLE IF E

  • python pandas库读取excel/csv中指定行或列数据

    目录 引言 1.根据index查询 2.已知数据在第几行找到想要的数据 3.根据条件查询找到指定行数据 4.找出指定列 5.找出指定的行和指定的列 6.在规定范围内找出符合条件的数据 总结 引言 关键!!!!使用loc函数来查找. 话不多说,直接演示: 有以下名为try.xlsx表: 1.根据index查询 条件:首先导入的数据必须的有index 或者自己添加吧,方法简单,读取excel文件时直接加index_col 代码示例: import pandas as pd #导入pandas库 ex

  • numpy库与pandas库axis=0,axis= 1轴的用法详解

    对数据进行操作时,经常需要在横轴方向或者数轴方向对数据进行操作,这时需要设定参数axis的值: axis = 0 代表对横轴操作,也就是第0轴: axis = 1 代表对纵轴操作,也就是第1轴: numpy库中横轴.纵轴 axis 参数实例详解: In [1]: import numpy as np #生成一个3行4列的数组 In [2]: a = np.arange(12).reshape(3,4) In [3]: a Out[3]: array([[ 0, 1, 2, 3], [ 4, 5,

  • 对pandas中两种数据类型Series和DataFrame的区别详解

    1. Series相当于数组numpy.array类似 s1=pd.Series([1,2,4,6,7,2]) s2=pd.Series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b'] 1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成. 下面是一些例

  • Python统计可散列的对象之容器Counter详解

    一.初始化Counter Counter支持3种形式的初始化,比如提供一个数组,一个字典,或单独键值对"="式赋值.具体初始化的代码如下所示: import collections a = collections.Counter(['a', 'a', 'b', 'b', 'b', 'c']) b = collections.Counter({"a": 2, "b": 3, "c": 1}) c = collections.Co

  • Pandas实现两个表的连接功能的方法详解

    目录 准备数据 先导入模块 输出内容 连接 内连接 外连接 左连接 右连接 上次介绍了pandas的多条件筛选,这些都是一些数据处理的必要技能,也不贪多,咱们每次学习一点. 这次咱们说说pandas的两个表的连接技能merge,也就是根据一个表的条件去匹配另一个表的内容. 话不多说,直接正文. 准备数据 先导入模块 import pandas as pd df1 = pd.DataFrame({     '姓名': ['张三', '李四', '王五', '刘六', '齐四'],     '号码'

  • SQL Server的行级安全性详解

    目录 一.前言 二.描述 三.权限 四.安全说明:侧信道攻击 五.跨功能兼容性 六.示例 一.前言 行级别安全性使您能够使用组成员身份或执行上下文来控制对数据库表中行的访问. 行级别安全性 (RLS) 简化了应用程序中的安全性设计和编码.RLS 可帮助您对数据行访问实施限制.例如,您可以确保工作人员仅访问与其部门相关的数据行.另一个示例是将客户的数据访问限制为仅与其公司相关的数据. 访问限制逻辑位于数据库层中,而不是远离另一个应用程序层中的数据.每次尝试从任何层访问数据时,数据库系统都会应用访问

  • MySQL通过触发器解决数据库中表的行数限制详解及实例

    MySQL通过触发器解决数据库中表的行数限制详解及实例 最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万. 当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL: delimiter $ create trigger limitLog before insert on OperationLog for each row begin if (select count(*) from OperationLog) > 1000

  • linux命令行批量创建目录详解

    linux命令行批量创建目录详解 以前一直用-p创建目录链,觉得很方便了. 在空目录/opt/app/myapp里创建src,再创建main,再创建java mkdir -p /opt/app/myapp/src/main/java 没想到还可以这样玩##¥%--&*( root@vm1:~/tmp# mkdir -p src/{{main,test}/{java,resources},main/webapp} root@vm1:~/tmp# tree . └── src ├── main │

随机推荐