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 产生多个统计数据
常用的统计描述方法:![](https://img2018.cnblogs.com/blog/1100100/201912/1100100-20191201193235749-17524611.png)
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
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!
posted on 2020-03-30 20:32 LoaderMan 阅读(1047) 评论(0) 编辑 收藏 举报