Pandas 中的数据重塑:pivot 学习

昨天感冒了,今天依然很不舒服,感觉书都看不懂了。今天来学习一下数据重塑功能之一:pivot

数据重塑

数据重塑表示重新排列一个表格型数据或者向量的结构的运算,使其适合于进一步的分析。

重塑功能

重塑层次化索引

这里就不详细介绍了,主要功能有:

  • stack:将数据的列“旋转”为行
  • unstack:将数据的行“旋转”为列

Pivot

pandas.DataFrame.pivot 官方文档

DataFrame.pivot(index=None, columns=None, values=None)

pivot函数根据列值重新设置数据(生成“数据透视表”)。使用索引/列中的唯一值形成生成的DataFrame的轴。该函数有三个参数:

  • index:string or object, optional
  • columns:string or object, optional
  • values:string or object, optional

需要在原始表中指定这三个参数所对定的列名,其中indexcolumns分别用作新表的行和列索引的列名,新表格中的数值由原始表中参数value对应的数据所表示。

Pivot 使用举例

举一个很简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [141]: df = pd.DataFrame({'foo': ['one','one','one','two','two','two'],
...: 'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
...: 'baz': [1, 2, 3, 4, 5, 6]})
...:
In [142]: df
Out[142]:
bar baz foo
0 A 1 one
1 B 2 one
2 C 3 one
3 A 4 two
4 B 5 two
5 C 6 two
In [143]: pv1 = df.pivot(index='foo', columns='bar', values='baz')
In [144]: pv1
Out[144]:
bar A B C
foo
one 1 2 3
two 4 5 6

可以看到生成了新表:

foo那一列的数据变成了新表的索引

bar的数据变成了新表的列名

baz的数据变成了新表里面的值

这时,我们在原来表df上添加一行数据

1
2
3
4
5
6
7
8
9
10
11
In [145]: df['test'] = np.random.randn(len(df))
In [146]: df
Out[146]:
bar baz foo test
0 A 1 one -0.736052
1 B 2 one -0.134206
2 C 3 one -0.115907
3 A 4 two -1.522626
4 B 5 two 0.655552
5 C 6 two -0.144060

新添了列名为test的一列数据

这时后我们再忽略最后一个参数,得到的新的DataFrame就会带有层次化的列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [147]: pv2 = df.pivot(index='foo', columns='bar')
In [148]: pv2
Out[148]:
baz test
bar A B C A B C
foo
one 1 2 3 -0.736052 -0.134206 -0.115907
two 4 5 6 -1.522626 0.655552 -0.144060
In [149]: pv2['test']
Out[149]:
bar A B C
foo
one -0.736052 -0.134206 -0.115907
two -1.522626 0.655552 -0.144060

注意,pivot其实只是一个快捷方式而已:用set_index创建层次化索引,再用unstack重塑

1
2
3
4
5
6
7
8
9
In [150]: unstacked = df.set_index(['foo', 'bar']).unstack('bar')
In [151]: unstacked
Out[151]:
baz test
bar A B C A B C
foo
one 1 2 3 -0.736052 -0.134206 -0.115907
two 4 5 6 -1.522626 0.655552 -0.144060