3.pandas进阶
3.1 数据重塑
🚩数据重塑其实就是行变列,列变行
3.1.1 一般数据
import numpy as np import pandas as pd df = pd.DataFrame(data = np.random.randint(0, 100, size = (10, 3)), index = list('ABCDEFHIJK'), columns = ['Python', 'Tensorflow', 'Keras']) display(df) # 转置 df.T
3.1.2 多层索引
df2 = pd.DataFrame(data = np.random.randint(0, 100, size = (20, 3)), index = pd.MultiIndex.from_product([list('ABCDEFHIJK'), ['期中', '期末']]),#多层索引 columns = ['Python', 'Tensorflow', 'Keras']) df2
我们来解释一下这个复杂的代码:ndex = pd.MultiIndex.from_product([list('ABCDEFHIJK'), ['期中', '期末']])
,我们的第一个参数:ABCDEFHIJK
,共是 10 个字母,第二个参数是两个字符串,所以我们一共会有 20行的数据,这正好对应了前面的代码size = (20, 3)
,读者自行理解下面这个代码:
df3 = pd.DataFrame(data = np.random.randint(0, 100, size = (10, 6)), index = list('ABCDEFHIJK'), columns = pd.MultiIndex.from_product([['Python', 'Math', 'English'], ['期中', '期末']])) df3
我们用 unstack() 完成多层索引行变列的数据重塑:
# 行索引变列索引,结构改变 # 默认情况下,最里层调整 df2.unstack()
可以看出来,只是把行索引最里层的期中期末 移到了列索引的位置,我们也可以把行索引外层的 ABCDEFHIJK 移动至列索引的位置:
df2.unstack(level = 0)
我们用 stack() 完成多层索引列变行的数据重塑:
# 列索引变行索引,结构改变 # 默认情况下,最里层调整 df3.stack()
同样,我们通过调整参数可以实现使得列索引的最外层变成行索引:
df3.stack(level = 0)
3.1.3 多层索引的运算
sum() 求和运算:
df2.sum()
当然,这样的数据一般是没有意义的,我们一般想要求出每一位同学的总分,而不是每门科目的总分:
df2.sum(axis = 1)
# 期中,期末消失 # 计算的是每个人,期中期末的总分数 df2.sum(level = 0)
mean() 用来计算平均分:
# 同学消失 # 计算的是所有同学期中期末平均分 df2.mean(level = 1)
接下来简单介绍一下如何取数据:
# df3是多层列索引,可以直接使用[],根据层级关系取数据 # 取出 A 同学的 Python 科目的期中成绩 df3['Python', '期中']['A']
df2['Python']['A', '期中']