我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

宽表改长表,使用的是pandasmelt()方法。那么,长表改宽表,使用的方法是pandaspivot方法。本文就这种pivot()方法进行简要的使用探讨。因为这个方法大概率会生成多重索引的dataframe,理解起来有些费解并且不常见,所以,本文就是简单的探讨而已。

苏南大叔:如何利用pandas的pivot()方法,实现长表改宽表的操作? - pandas-pivot
如何利用pandas的pivot()方法,实现长表改宽表的操作?(图3-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,本文讨论长表变宽表的方法pivot()。测试环境:win10python@3.11.0numpy@1.24.2pandas@1.5.3。本文例子中的返回结果,不能用普通的方式去解读,因为索引都是复合多重的。仅供了解,目前是有些超纲。

pivot,n.枢轴; 中心; 支点; 核心; 中心点; 最重要的人(或事物);v. (使)在枢轴上旋转(或转动);

函数说明

pivotPandas中的一个函数,可以将一个数据框中的列进行转换,使得某一列成为新的行索引,并用另一列的值来填充这个索引对应的单元格。有如下几个参数:

  • index: 将要成为新的行索引的列名
  • columns: 将要成为新的列索引的列名
  • values: 将要填充新行索引和新列索引之间的单元格的列名

宽表改长表,主体的值会有冗余,但是还是能接受的。但是这个长表改宽表,颠覆了dataframe中的labels的概念,列名和行名都变成了个dataframe,索引理解上是比较费解了。

标的数据

import pandas as pd
df = pd.DataFrame(
    {
        "name": ["虎子", "老许", "小黑"],
        "head": [10, 30, 50],
        "body": ["A", "B", "C"],
        "foot": ["a", "b", "c"]
    },
    index=["a1", "a2", "a3"],
)
print(df)

输出:

    name   head  body  foot
a1   虎子    10    A    a
a2   老许    30    B    b
a3   小黑    50    C    c

情况一,参数非数组

df_pivot = df.pivot(index='name', columns='head')
print(df_pivot)

输出:

       body           foot
head   10   30   50   10   30   50
name
小黑    NaN  NaN    C  NaN  NaN    c
老许    NaN    B  NaN  NaN    b  NaN
虎子      A  NaN  NaN    a  NaN  NaN
df_pivot = df.pivot(index='name', columns='head', values='body')
print(df_pivot)

输出:

head    10   30   50
name
小黑    NaN  NaN    C
老许    NaN    B  NaN
虎子      A  NaN  NaN

苏南大叔:如何利用pandas的pivot()方法,实现长表改宽表的操作? - pivot情况一
如何利用pandas的pivot()方法,实现长表改宽表的操作?(图3-2)

df_pivot = df.pivot(index='name', columns='head')['body']
print(df_pivot,type(df_pivot))

输出:

head   10   30   50
name
小黑    NaN  NaN    C
老许    NaN    B  NaN
虎子      A  NaN  NaN 

<class 'pandas.core.frame.DataFrame'>

情况二,参数为数组

df_pivot = df.pivot(index=['name','head'], columns='body', values='foot')
print(df_pivot)

输出:

body         A    B    C
name head
小黑   50    NaN  NaN    c
老许   30    NaN    b  NaN
虎子   10      a  NaN  NaN
df_pivot = df.pivot(index=['name'], columns=['head','body'], values='foot')
print(df_pivot)

输出:

head   10   30   50
body    A    B    C
name
小黑    NaN  NaN    c
老许    NaN    b  NaN
虎子      a  NaN  NaN

苏南大叔:如何利用pandas的pivot()方法,实现长表改宽表的操作? - pivot情况二
如何利用pandas的pivot()方法,实现长表改宽表的操作?(图3-3)

df_pivot = df.pivot(index=["name"], columns=["head"], values=["body", "foot"])
print(df_pivot)

输出:

       body           foot
head   10   30   50   10   30   50
name
小黑    NaN  NaN    C  NaN  NaN    c
老许    NaN    B  NaN  NaN    b  NaN
虎子      A  NaN  NaN    a  NaN  NaN

结束语

苏南大叔并不打算在多重索引的dataframe上做过多文章阐述,毕竟普通的dataframe还没有搞清楚。所以,这接下来的多重索引的dataframe内容就待续吧。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python