前文我们聊过了数据重塑中的stack
和unstack
,今天继续聊聊透视表功能,该功能和Excel中的数据透视功能相似。
-
pivot
:对原始DataFrame进行变形整理。 -
pivot table
:可以在数据变形整理的基础上,做数据聚合操作。
下面使用图中数据对其进行说明
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, 3, 4, 5, 6, 7, 8, 9, 10]
})
1. Pivot
将原始DataFrame重塑,返回一个新的DataFrame,大体变形过程如下图所示。
简要说明其参数:
-
data
:需要做数据透视的原始DataFrame数据 -
columns
:指定一个或多个列的值作为新DataFrame的列 -
index
:指定一个或多个列的值作为新DataFrame的index,注意其值不可以重复,否则报错(可选,若不填则使用现有index) -
values
:指定一个或多列的值作为新DataFrame的值(可选,若不填则使用所有剩余列)
1.1 只指定必填参数
以指定columns
为例,以B列的值作为新DataFrame的列名,会默认将其余所有列作为values,缺失值以np.nan
替代。
可以理解为:原index不变,而以B列中的one
和two
来作为列名,展示DataFrame中所有的数据。
pd.pivot(df, columns="B")
1.2 指定所有参数
# 批定index时,注意该列的值不可重复
# 指定一列时,该列值不可重复;指定多列时,第一列的值不可重复。
pd.pivot(df, columns="B",
values="D", index=["E","C"])
2. Pivot Table
使用pivot
只能对数据进行变形整理,有时还需要做新的数据做聚合分析,就可以使用pivot table
,大体逻辑如下图。
该方法参数比较多,简单对其进行说明:
-
data
:需要做数据透视的原始DataFrame数据 -
values
:一列或多列做聚合处理的列名 -
index
:在数据透视表index上进行分组的列,与pivot
不同的是此处列中的值可以重复,因为会做聚合。 -
columns
: 在数据透视表列上进行分组的列 -
aggfunc
: 将要应用的聚合函数,默认是计算均值numpy.mean
data
,values
,index
和columns
的用法与pivot
基本一致,主要说一说aggfunc
2.1 指定一个聚合函数
对数据透视表中的D
和E
的数据做求和计算
pd.pivot_table(df,values=["D","E"],
index=["A"],
columns=["C"],
aggfunc=np.sum)
2.2 指定多个聚合函数
对所有数据,同时做求和和平均值计算
pd.pivot_table(df,values=["D","E"],
index=["A"],
columns=["C"],
aggfunc=[np.sum,np.mean])
2.3 各value列指定不同聚合函数
对D
列的值做求和,对E
列的值计算平均值
pd.pivot_table(df,values=["D","E"],
index=["A"],
columns=["C"],
aggfunc={"D":np.sum,"E":np.mean})