层级索引
创建一个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 产生多个统计数据
示例:
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](https://i-blog.csdnimg.cn/blog_migrate/c1618f0060d26c2214441a19aa6bf41c.jpeg)