1、pivot:通过指定的索引和列对数据进行重塑,无法聚合。
语法:
DataFrame.pivot(self, index=None, columns=None, values=None)
构建一个 DataFrame 数据
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df
foo bar baz zoo
0 one A 1 x
1 one B 2 y
2 one C 3 z
3 two A 4 q
4 two B 5 w
5 two C 6 t
使用 pivot 进行重塑
df.pivot(index='foo', columns='bar', values='baz')
bar A B C
foo
one 1 2 3
two 4 5 6
df.pivot(index='foo', columns='bar')
Out[129]:
baz zoo
bar A B C A B C
foo
one 1 2 3 x y z
two 4 5 6 q w t
但是,如果指定的 index + columns 构成的数据里面存在重复的情况,将会报错
df = pd.DataFrame({"foo": ['one', 'one', 'two', 'two'],
"bar": ['A', 'A', 'B', 'C'],
"baz": [1, 2, 3, 4]})
df
foo bar baz
0 one A 1
1 one A 2
2 two B 3
3 two C 4
df.pivot(index='foo', columns='bar', values='baz')
Traceback (most recent call last): # 报错内容
...
ValueError: Index contains duplicate entries, cannot reshape
2、pivot_table:通过指定的索引和列对数据进行重塑,可以聚合
语法:
DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)
构建一个 DataFrame 数据
# 仍然使用上一个被报错的例子
df = pd.DataFrame({"foo": ['one', 'one', 'two', 'two'],
"bar": ['A', 'A', 'B', 'C'],
"baz": [1, 2, 3, 4]})
df
foo bar baz
0 one A 1
1 one A 2
2 two B 3
3 two C 4
使用 pivot_table 进行重塑、聚合
df.pivot_table(index='foo', columns='bar', values='baz') # 默认的聚合函数为:mean
Out[135]:
bar A B C
foo
one 1.5 NaN NaN
two NaN 3.0 4.0
# 还可以进行其他聚合操作,比如:求和
df.pivot_table(index='foo', columns='bar', values='baz').sum()
Out[136]:
bar
A 1.5
B 3.0
综述:
1. pivot:无法聚合,只能简单重塑,如果存在重复数据将会报错;常用于处理非数字数据。
2. pivot_table:可以聚合,正好弥补 pivot 的缺陷。