pandas层级索引和统计计算

层级索引(hierarchical indexing)

下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引。

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])
print(ser_obj)

效果

a  0    0.148659
   1    0.392730
   2   -0.410365
b  0   -1.441815
   1   -1.085728
   2   -1.755635
c  0    0.548349
   1    0.186693
   2    0.355762
d  0   -0.055593
   1    0.180773
   2    0.532658
dtype: float64

MultiIndex索引对象

  • 打印这个Series的索引类型,显示是MultiIndex

  • 直接将索引打印出来,可以看到有lavels,和labels两个信息。lavels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])
# print(ser_obj)
print(type(ser_obj.index))
print(ser_obj.index)

效果:

<class 'pandas.core.indexes.multi.MultiIndex'>
MultiIndex([('a', 0),
            ('a', 1),
            ('a', 2),
            ('b', 0),
            ('b', 1),
            ('b', 2),
            ('c', 0),
            ('c', 1),
            ('c', 2),
            ('d', 0),
            ('d', 1),
            ('d', 2)],
           )

选取子集

  • 根据索引获取数据。因为现在有两层索引,当通过外层索引获取数据的时候,可以直接利用外层索引的标签来获取。

  • 当要通过内层索引获取数据的时候,在list中传入两个元素,前者是表示要选取的外层索引,后者表示要选取的内层索引。

1. 外层选取:

ser_obj['outer_label']

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])

# 外层选取
print(ser_obj['c'])

效果

0    0.072428
1    1.194215
2   -1.456029
dtype: float64

2. 内层选取:

ser_obj[:, 'inner_label']

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])

# 内层选取
print(ser_obj[:, 2])

效果

a   -0.098249
b    1.807483
c   -0.294296
d    0.243345
dtype: float64

常用于分组操作、透视表的生成等

交换分层顺序

1. swaplevel()

.swaplevel( )交换内层与外层索引。

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])

print(ser_obj.swaplevel())

效果

0  a   -0.475376
1  a    0.012922
2  a    0.130198
0  b    0.119821
1  b   -0.315828
2  b    0.033378
0  c   -0.156276
1  c   -0.496511
2  c   -1.493716
0  d   -0.453016
1  d   -0.556026
2  d    0.380415
dtype: float64

交换并排序分层

swaplevel()

.sort_index( )先对外层索引进行排序,再对内层索引进行排序,默认是升序。

import pandas as pd
import numpy as np

ser_obj = pd.Series(np.random.randn(12), index=[
    ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
])
print(ser_obj)
# 交换并排序分层
print(ser_obj.swaplevel().sort_index())

效果:

a  0    1.118216
   1   -1.228231
   2   -1.236862
b  0   -0.049346
   1    0.596290
   2   -0.552489
c  0    1.338643
   1    0.277671
   2   -1.892496
d  0   -1.344015
   1    0.421452
   2    0.232528
dtype: float64
0  a    1.118216
   b   -0.049346
   c    1.338643
   d   -1.344015
1  a   -1.228231
   b    0.596290
   c    0.277671
   d    0.421452
2  a   -1.236862
   b   -0.552489
   c   -1.892496
   d    0.232528

Pandas统计计算和描述

常用的统计计算

  • sum, mean, max, min…

axis=0 按列统计,axis=1按行统计

skipna 排除缺失值, 默认为True

常用的统计描述

describe 产生多个统计数据

常用的统计描述方法:

demo:

import numpy as np
import pandas as pd

df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
print("df_obj")
print(df_obj)
print("df_obj.sum()")
print(df_obj.sum())
print("df_obj.max()")
print(df_obj.max())
print("df_obj.min()")
print(df_obj.min(axis=1, skipna=False))
print("df_obj.describe()")
print(df_obj.describe())

效果:

df_obj
          a         b         c         d
0  0.990848 -0.626976 -0.826166 -0.961985
1  1.314470  0.417564 -0.334301  0.434747
2  0.451489 -0.182809  0.531624 -1.564701
3 -1.304920 -0.377381 -2.644873  0.289440
4  1.379152 -0.150612 -0.608031  1.840602
df_obj.sum()
a    2.831040
b   -0.920214
c   -3.881746
d    0.038103
dtype: float64
df_obj.max()
a    1.379152
b    0.417564
c    0.531624
d    1.840602
dtype: float64
df_obj.min()
0   -0.961985
1   -0.334301
2   -1.564701
3   -2.644873
4   -0.608031
dtype: float64
df_obj.describe()
              a         b         c         d
count  5.000000  5.000000  5.000000  5.000000
mean   0.566208 -0.184043 -0.776349  0.007621
std    1.108532  0.386206  1.164946  1.326086
min   -1.304920 -0.626976 -2.644873 -1.564701
25%    0.451489 -0.377381 -0.826166 -0.961985
50%    0.990848 -0.182809 -0.608031  0.289440
75%    1.314470 -0.150612 -0.334301  0.434747
max    1.379152  0.417564  0.531624  1.840602
原文地址:https://www.cnblogs.com/loaderman/p/11967276.html