pandas 索引_【Python】Pandas层级索引和统计计算

7bc1e5ba00528813bfef89ec43c2e86e.gif

层级索引

创建一个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 产生多个统计数据

a531e2bf888c6e0bef728dc488fc9dfe.png

示例:

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

  码上加油站

  一起来加油

长按扫码关注

a7e2e1ff0d1f40a778c0e7cf04027562.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值