下面就为您详细讲解“一文搞懂Pandas数据透视的4个函数的使用”的完整攻略。
1. 功能介绍
Pandas是一个Python数据分析库,数据透视是其中一个常用的操作。Pandas提供了4个函数来实现数据透视,这4个函数分别是:
pivot_table()
: 生成透视表crosstab()
: 生成交叉表melt()
: 将宽表转换成长表stack() & unstack()
: 将多层索引的透视表转换成一层索引的透视表
这4个函数都可实现数据透视的功能,但是各有不同的使用场景和特点。接下来我们将逐一介绍这4个函数及其使用方法。
2. pivot_table()
pivot_table()
函数可以根据指定的行、列和值进行数据透视,并生成一个透视表。
函数基本语法如下:
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
其中,参数说明如下:
- data:数据源,可以是DataFrame、Series、dict、list等。
- values:指定汇总的数据列。
- index:用于设置行索引的列。
- columns:用于设置列索引的列。
- aggfunc:指定汇总统计的方法,比如mean、sum、count等。
- fill_value:指定填充缺失值的内容。
- margins:是否在结果中显示全部汇总数据。
- dropna:是否删除包含缺失值的行或列。
- margins_name:指定全部汇总数据显示的名称。
下面来看一个示例:
import pandas as pd
df = pd.read_csv('sales.csv')
print(df)
# 根据product列和month列生成透视表
# 行索引为product列的值,列索引为month列的值
# 对price列进行sum统计
result = pd.pivot_table(df, values='price', index='product', columns='month', aggfunc='sum')
print(result)
在代码中,我们首先使用read_csv()
函数读取了一个销售数据,然后使用pivot_table()
函数根据product列和month列生成了一个透视表。生成的透视表如下:
month | Apr | Aug | Mar | May |
---|---|---|---|---|
A | 80 | 80 | 40 | 70 |
B | 120 | 140 | 100 | 90 |
C | 210 | 200 | 180 | 180 |
从结果中可以看出,通过pivot_table()
函数,我们成功地生成了一个透视表。
3. crosstab()
crosstab()
函数可以生成交叉表,用于统计两个或多个变量之间的频数或频率分布情况。
函数基本语法如下:
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
其中,参数说明如下:
- index:用于行索引的列或数组。
- columns:用于列索引的列或数组。
- values:需要进行汇总的数据列。
- rownames:行索引的名称。
- colnames:列索引的名称。
- aggfunc:汇总处理的方法,如sum、mean、count等。
- margins:是否在结果中显示全部汇总数据。
- dropna:是否删除包含缺失值的行或列。
- normalize:是否按比例归一化。
下面来看一个示例:
import pandas as pd
df = pd.read_csv('sales.csv')
print(df)
# 构建交叉表
result = pd.crosstab(df['product'], df['month'], values=df['price'], aggfunc='sum')
print(result)
在代码中,我们使用crosstab()
函数根据product列和month列生成了一个交叉表。生成的交叉表如下:
month | Apr | Aug | Mar | May |
---|---|---|---|---|
A | 80 | 80 | 40 | 70 |
B | 120 | 140 | 100 | 90 |
C | 210 | 200 | 180 | 180 |
从结果中可以看出,通过crosstab()
函数,我们成功地生成了一个交叉表。
4. melt()
melt()
函数可以将宽表转换成长表。
函数基本语法如下:
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
其中,参数说明如下:
- frame:需要进行转换的数据表。
- id_vars:保留的列。
- value_vars:需要转换的列。
- var_name:转换后的列名称。
- value_name:转换后的值的列名称。
- col_level:列的深度,用于多层列索引。
下面来看一个示例:
import pandas as pd
df = pd.read_csv('sales_wide.csv')
print(df)
# 将宽表转换成长表
result = pd.melt(df, id_vars=['product'], value_vars=['Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'], var_name='month', value_name='price')
print(result)
在代码中,我们首先使用read_csv()
函数读取了一个宽表数据,然后使用melt()
函数将宽表转换成了长表。转换后的长表如下:
product | month | price | |
---|---|---|---|
0 | A | Apr | 80 |
1 | B | Apr | 120 |
2 | C | Apr | 210 |
3 | A | May | 70 |
4 | B | May | 90 |
5 | C | May | 180 |
... | ... | ... | ... |
从结果中可以看出,通过melt()
函数,我们成功地将一个宽表转换成了一个长表。
5. stack()
和unstack()
stack()
和unstack()
函数可以将多层索引的透视表转换成一层索引的透视表。
函数基本语法如下:
# 将列索引转换成行索引
df.stack()
# 将行索引转换成列索引
df.unstack()
其中,参数说明如下:
- df:需要进行转换的DataFrame对象。
下面来看一个示例:
import pandas as pd
df = pd.read_csv('sales.csv')
print(df)
# 根据product列和month列生成透视表
# 行索引为product列的值,列索引为month列的值
# 对price列进行sum统计
result = pd.pivot_table(df, values='price', index='product', columns='month', aggfunc='sum')
print(result)
# 将列索引转换成行索引
result = result.stack()
print(result)
# 将行索引转换成列索引,重置索引
result = result.unstack().reset_index()
print(result)
在代码中,我们先使用pivot_table()
函数生成了一个透视表。然后,我们使用stack()
函数将透视表的列索引转换成了行索引,再使用unstack()
函数将行索引转换成了列索引,并重置了索引。转换后的表如下:
product | month | price | |
---|---|---|---|
0 | A | Apr | 80 |
1 | A | Aug | 80 |
2 | A | Mar | 40 |
3 | A | May | 70 |
4 | B | Apr | 120 |
5 | B | Aug | 140 |
... | ... | ... | ... |
从结果中可以看出,通过stack()
和unstack()
函数,我们成功地将一个多层索引的透视表转换成了一个一层索引的透视表。
以上就是本文对Pandas数据透视的4个函数的使用方法的详细讲解,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Pandas数据透视的4个函数的使用 - Python技术站