Pandas - Reshaping Data
一、案例数据准备
import pandas as pd
# 这里假设我们有 5 个人,每个人有 2 种属性数据,共 15 个元素
d = {'name' : pd.Series(['a', 'b', 'c', 'd','e'], index=[0,1,2,3,4]),
'attri_1' : pd.Series([1.1, 2.2, 3.3, 4.4,5.5], index=[0,1,2,3,4]),
'attri_2' : pd.Series([1, 2, 3, 4, 5], index=[0,1,2,3,4])
}
df = pd.DataFrame(d)
print(df)
运行结果:
name attri_1 attri_2
0 a 1.1 1
1 b 2.2 2
2 c 3.3 3
3 d 4.4 4
4 e 5.5 5
二、将所有数据展开,汇聚到行显示
2.1 全展开
df_2 = df.melt()
# 将 5 行 3 列的数据转化为 每行 1 个数据,即 15 行数据
# 每一行有 index,variable(原列标签),value(原列中的各个值)
# 这里的显示表示,我们想要看到所有的 5 个 人名, 5 个 属性_1 的值, 5个 属性_2 的值
print(df_2)
运行结果:
variable value
0 name a
1 name b
2 name c
3 name d
4 name e
5 attri_1 1.1
6 attri_1 2.2
7 attri_1 3.3
8 attri_1 4.4
9 attri_1 5.5
10 attri_2 1
11 attri_2 2
12 attri_2 3
13 attri_2 4
14 attri_2 5
2.2 展开特定的列
df_3 = df.melt(id_vars=['name'], var_name = 'attri')
# 以第一列为锚定,展开后面 2 列,10 种组合
# 我们想查看 5 个人的 属性_1 分布,和 属性_2 分布
print(df_3)
运行结果:
name attri value
0 a attri_1 1.1
1 b attri_1 2.2
2 c attri_1 3.3
3 d attri_1 4.4
4 e attri_1 5.5
5 a attri_2 1.0
6 b attri_2 2.0
7 c attri_2 3.0
8 d attri_2 4.0
9 e attri_2 5.0
三、将汇聚的数据分散到列显示(类似数据透视表)
df_4 = df_3.pivot(index='name',columns='attri',values='value')
# 这种功能类似于 数据透视表,这里的 'name' 这列已经不再是一列,而是 index
print(df_4)
运行结果:
attri attri_1 attri_2
name
a 1.1 1.0
b 2.2 2.0
c 3.3 3.0
d 4.4 4.0
e 5.5 5.0
3.1 显示其中一列
print(df_4['attri_1']) # 显示 attri_1 这一列的元素
运行结果:
name
a 1.1
b 2.2
c 3.3
d 4.4
e 5.5
Name: attri_1, dtype: float64
3.2 显示其中一行
print(df_4.loc['b']) # 显示 'b' 这一行的元素
运行结果:
attri
attri_1 2.2
attri_2 2.0
Name: b, dtype: float64