pandas基础(part5)--透视表与交叉表

学习笔记,这个笔记以例子为主。
开发工具:Spyder



Pandas透视表

透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行分组聚合,并对每个分组进行数据汇总

  • 语法
# 以A与B做分组汇总数据,针对D的每个值列级分组统计,统计每个分组下C列的最大值,并添加行、列小计
data.pivot_table(index=['A', 'B'], values=['C'], 
                       columns=['D'], margins=True, aggfunc='max')

接下来,我们用几个例子来学习如何用pandas来制作想要的数据透视表。

首先,我们来康康接下来几个例子所要使用的数据:

代码:

import pandas as pd

leftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],
        'gender':['M', 'F', 'M', 'M', 'M', 
                 'F', 'M', 'M', 'M', 'F'],
        'Bunny_id':[1, 2, 3, 4, 2, 4, 3, 1, 4, 5]}

rightD = {'Bunny_id':[1, 2, 3, 4, 5],
         'foods':['A', 'B', 'C', 'D', 'E']}


df_leftD = pd.DataFrame(leftD)
df_rightD = pd.DataFrame(rightD)

df = pd.merge(df_leftD, df_rightD, how = 'outer')
print(df)

数据:

   Bunny_id  age gender    name  weight foods
0         1    9      M     Ada       8     A
1         1    9      M   Peter       5     A
2         2    9      F     Tom       4     B
3         2   10      M     Lee      10     B
4         3   10      M   Black       5     C
5         3    8      M    Blue       4     C
6         4   10      M    Jack       6     D
7         4   10      F  Yellow      10     D
8         4    7      M   Green       4     D
9         5    8      F   Trump       8     E
  • 例子1

代码:

#以Bunny_id做分组汇总数据,默认统计所有列的均值
print(df.pivot_table(index=['Bunny_id']))

结果:

          age    weight
Bunny_id               
1         9.0  6.500000
2         9.5  7.000000
3         9.0  4.500000
4         9.0  6.666667
5         8.0  8.000000

由结果可知,由于除了Bunny_id这个变量以外,只有age和weight为数值型变量,故pandas计算了age和weight的均值。

  • 例子2

代码:

#以Bunny_id与gender做分组汇总数据,默认统计所有列的最大值
print(df.pivot_table(index=['Bunny_id', 'gender'], aggfunc='max'))

结果:

                 age foods    name  weight
Bunny_id gender                           
1        M         9     A   Peter       8
2        F         9     B     Tom       4
         M        10     B     Lee      10
3        M        10     C    Blue       5
4        F        10     D  Yellow      10
         M        10     D    Jack       6
5        F         8     E   Trump       8

由结果可知,pandas先按照Bunny_id进行分组,再按照gender进行分组。最后对分组结果,分别计算age、foods、name、weight的最大值。

  • 例子3

代码:

#以Bunny_id与gender做分组汇总数据,统计age列的均值
print(df.pivot_table(index=['Bunny_id', 'gender'], values=['age']))

结果:

                  age
Bunny_id gender      
1        M        9.0
2        F        9.0
         M       10.0
3        M        9.0
4        F       10.0
         M        8.5
5        F        8.0

由结果可知,pandas先对Bunny_id和gender进行分组,并只显示age的分组平均值。

  • 例子4

代码:

#以Bunny_id与gender做分组汇总数据,针对weight的每个值列级分组,统计age列的均值。
print(df.pivot_table(index=['Bunny_id', 'gender'], 
                     values=['age'], columns=['weight']))

结果;

                 age                       
weight            4     5     6    8     10
Bunny_id gender                            
1        M       NaN   9.0   NaN  9.0   NaN
2        F       9.0   NaN   NaN  NaN   NaN
         M       NaN   NaN   NaN  NaN  10.0
3        M       8.0  10.0   NaN  NaN   NaN
4        F       NaN   NaN   NaN  NaN  10.0
         M       7.0   NaN  10.0  NaN   NaN
5        F       NaN   NaN   NaN  8.0   NaN

由结果可知,Bunny_id和gender的组合作为行,weight作为列,共同构造了二维表,表中值为每个分组中age的平均值,如果对应分组没有值,则该位置用NaN代替。

Pandas交叉表

交叉表(cross-tabulation, 简称crosstab)是一种用于计算分组频率的特殊透视表

  • 语法
# 按照A列的观测值进行分组,针对不同的B,统计频数
pd.crosstab(data.A, data.B, margins=True)
  • 例子(接上面透视表案例中的数据)

代码:

print(pd.crosstab(df.gender, df.foods)) 

结果:

foods   A  B  C  D  E
gender               
F       0  1  0  1  1
M       2  1  2  2  0
发布了141 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/105234847