pandas
透视
看过来
《pandas 教程》 持续更新中,可作为 pandas 入门进阶课程、pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。查看更新日志。作者开办 Python 数据分析训练营正在报名中,详情 Python 数据分析训练营。
![]() |
本教程作者所著新书《Python之光:Python编程入门与实战》(ISBN:9787111729891)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
数据透视是最常用的数据汇总工具,Excel 中经常会做数据透视,它可以根据一个或者多个指定的维度来聚合数据。Pandas 也提供了数据透视函数来实现这些功能。
可以看一下它的逻辑:
这里有三个参数,作用分别是:
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']})
'''
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
'''
# 透视
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')['baz']
'''
bar A B C
foo
one 1 2 3
two 4 5 6
'''
# 指定值
df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])
'''
baz zoo
bar A B C A B C
foo
one 1 2 3 x y z
two 4 5 6 q w t
'''
以下是《深入浅出Pandas》中的一个例子:
df.pivot()
只能将数据进行整理,如果遇到重复值要进行聚合计算,就要用到pd.pivot_table()
。它可以实现类似 Excel 那样的高级数据透视功能。
一些参数介绍:
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
"bar", "bar", "bar", "bar"],
"B": ["one", "one", "one", "two", "two",
"one", "one", "two", "two"],
"C": ["small", "large", "large", "small",
"small", "large", "small", "small",
"large"],
"D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
"E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
df
'''
A B C D E
0 foo one small 1 2
1 foo one large 2 4
2 foo one large 2 5
3 foo two small 3 5
4 foo two small 3 6
5 bar one large 4 6
6 bar one small 5 8
7 bar two small 6 9
8 bar two large 7 9
'''
将 D 列值加和,索引为 AB,列为 C 不去重值:
table = pd.pivot_table(df, values='D', index=['A', 'B'],
columns=['C'], aggfunc=np.sum)
table
'''
C large small
A B
bar one 4.0 5.0
two 7.0 6.0
foo one 4.0 1.0
two NaN 6.0
'''
空值的传入:
table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'],
aggfunc={'D': np.mean,
'E': np.mean})
不同值使用不同的聚合计算方式:
table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'],
aggfunc={'D': np.mean,
'E': [min, max, np.mean]})
汇总边际,给列的每层加一个 all 列进行汇总,计算方式与 aggfunc 相同。
pd.pivot_table(df, values='D', index=['A', 'B'],
columns=['C'], aggfunc=np.sum,
margins=True)
todo.