Pandas Python 中数据如何进行汇总?
作为一位数据分析师或数据科学家,最常用到的就是数据汇总,而 Pandas 正是这方面的一大神器。Pandas 是一个强大的 Python 数据处理库,可以高效地合并、重组和聚合大量数据。在本文中,我们将介绍若干种 Pandas 中数据汇总的方式,帮助你更好地理解 Pandas 中的聚合操作。
更多Pandas相关文章,请阅读:Pandas 教程
聚合(Aggregation)
聚合操作是指将一组值集合并为单个值的计算方法。在 Pandas 中,用户可以通过sum()、mean()、median()、mode()、count()、min()、max() 等方法进行数据的聚合计算。
比如说现在有以下销售数据:
import pandas as pd
data = {'Name': ['Tom', 'Tom', 'Jerry', 'Jerry', 'Jerry', 'Tom'],
'Product': ['Cellphone', 'Tablet', 'TV', 'Laptop', 'Laptop', 'Cellphone'],
'Price': [8000, 5000, 3500, 7000, 6500, 6500]}
df = pd.DataFrame(data)
print(df)
输出:
Name Product Price
0 Tom Cellphone 8000
1 Tom Tablet 5000
2 Jerry TV 3500
3 Jerry Laptop 7000
4 Jerry Laptop 6500
5 Tom Cellphone 6500
对于此数据,我们可以使用 count 方法计算出每种产品销售的数量:
df.groupby('Product')['Name'].count()
输出:
Product
Cellphone 2
Laptop 2
TV 1
Tablet 1
Name: Name, dtype: int64
在这里,我们通过 groupby() 方法按照产品名称分组,然后使用 count() 方法计算每个分组的数量。
你也可以使用 sum()、mean()、median()、mode()、min()、max() 等方法计算每个分组的总和、平均值、中位数、众数、最小值和最大值。比如可以计算每种产品的平均售价:
df.groupby('Product')['Price'].mean()
输出:
Product
Cellphone 7250.000000
Laptop 6750.000000
TV 3500.000000
Tablet 5000.000000
Name: Price, dtype: float64
Pivot Table
上述示例中,我们使用了 groupby() 方法对数据进行汇总。此外,还有一种常用的方法是使用 pd.pivot_table() 函数进行汇总。
pd.pivot_table() 函数可以处理类似于 Excel 中的数据透视表功能,它可以对数据按照指定的行和列进行分组,并计算出所需的聚合计算。
试想现在有一张包含药品名称、药店名称、销售额和销售日期等信息的数据表,我们需要将药品名称作为行索引,药店名称作为列索引,并计算出每个药店在不同日期的销售额。
import pandas as pd
import datetime
data = {'Drug': ['Drug A', 'Drug A', 'Drug A', 'Drug B', 'Drug B', 'Drug B'],
'Pharmacy': ['P1', 'P2', 'P1', 'P2', 'P3', 'P2'],
'Date': [datetime.date(2021, 5, 1), datetime.date(2021, 5, 2), datetime.date(2021, 5, 2),
datetime.date(2021, 5, 1), datetime.date(2021, 5, 2), datetime.date(2021, 5, 2)],
'Revenue': [8000, 5000, 6000, 3500, 7000, 6500]}
df = pd.DataFrame(data)
print(df)
输出:
Drug Pharmacy Date Revenue
0 Drug A P1 2021-05-01 8000
1 Drug A P2 2021-05-02 5000
2 Drug A P1 2021-05-02 6000
3 Drug B P2 2021-05-01 3500
4 Drug B P3 2021-05-02 7000
5 Drug B P2 2021-05-02 6500
那么我们可以使用 pd.pivot_table() 函数来实现以下需求:
pd.pivot_table(df, values='Revenue', index='Drug', columns='Pharmacy', aggfunc='sum')
输出:
Pharmacy P1 P2 P3
Drug
Drug A 14000 5000.0 NaN
Drug B NaN 10000.0 7000.0
在这里,我们按照药品名称(Drug)作为行索引,药店名称(Pharmacy)作为列索引,然后计算了每个药店的销售额总和。
Groupby
groupby 是 Pandas 中最重要的工具之一,可以方便地对数据进行分组操作。groupby 机制经常用于以下操作:
- 分组聚合计算(如,sum、mean、median、min、max 等);
- 针对多个列分组计算;
- 对每一列应用不同的聚合操作;
- 针对有 NA 值的数据对分组进行过滤。
试想一个简单的场景:我们有一份基于某全国人口统计的数据,该数据包含城市、年龄、性别和收入等信息。我们需要统计每个城市,不同性别和年龄段的平均收入。
import pandas as pd
data = {'City': ['Beijing', 'Beijing', 'Shanghai', 'Shanghai', 'Hangzhou', 'Hangzhou'],
'Age': ['18-25', '26-30', '18-25', '26-30', '18-25', '26-30'],
'Gender': ['M', 'M', 'F', 'F', 'M', 'M'],
'Income': [7000, 9000, 8000, 10000, 5000, 6000]}
df = pd.DataFrame(data)
print(df)
输出:
City Age Gender Income
0 Beijing 18-25 M 7000
1 Beijing 26-30 M 9000
2 Shanghai 18-25 F 8000
3 Shanghai 26-30 F 10000
4 Hangzhou 18-25 M 5000
5 Hangzhou 26-30 M 6000
我们可以首先按照城市和性别进行分组,然后计算每个分组的收入平均值:
df.groupby(['City', 'Gender'])['Income'].mean()
输出:
City Gender
Beijing M 8000.0
Hangzhou M 5500.0
Shanghai F 9000.0
Name: Income, dtype: float64
我们还可以按照城市、性别和年龄段进行分组,并计算每个分组的收入平均值:
df.groupby(['City', 'Gender', 'Age'])['Income'].mean()
输出:
City Gender Age
Beijing M 18-25 7000.0
26-30 9000.0
Hangzhou M 18-25 5000.0
26-30 6000.0
Shanghai F 18-25 8000.0
26-30 10000.0
Name: Income, dtype: float64
Merging
在实际数据分析中,我们经常需要从多个表格中获取数据并合并,这时候就需要用到 Pandas 中的合并函数。Pandas 提供了多种方法用于合并两个 DataFrame,其中最常用的是 merge() 函数。
假设我们有两份数据:一份是包含学生姓名和班级信息的表格,另一份是包含学生姓名和成绩信息的表格。现在我们需要将这两份表格合并成一个表格,包含学生姓名、班级和成绩信息。
import pandas as pd
class_data = {'Name': ['Tom', 'Jim', 'Sara', 'Mary'],
'Class': ['A', 'B', 'A', 'B']}
scores_data = {'Name': ['Tom', 'Jim', 'Mary', 'Sara'],
'Score': [80, 90, 70, 85]}
class_df = pd.DataFrame(class_data)
scores_df = pd.DataFrame(scores_data)
print(class_df)
print(scores_df)
输出:
Name Class
0 Tom A
1 Jim B
2 Sara A
3 Mary B
Name Score
0 Tom 80
1 Jim 90
2 Mary 70
3 Sara 85
我们可以使用 merge() 函数根据学生姓名将两份数据表合并:
merged_df = pd.merge(class_df, scores_df, on='Name')
print(merged_df)
输出:
Name Class Score
0 Tom A 80
1 Jim B 90
2 Sara A 85
3 Mary B 70
在这里,我们使用 on 参数指定了合并的列名,合并结果包含了学生姓名、班级和成绩信息。
Concatenation
在 pandas 中,多个 DataFrame 可以通过 concatenate() 函数进行合并。这个函数可以接受一个包含多个 DataFrame 的列表,并将它们沿着指定的轴(默认轴为 0)进行拼接。
例如,我们有三个包含同样列名的 DataFrame,每个 DataFrame 包含两个不同的行:
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2],
'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6],
'B': [7, 8]})
df3 = pd.DataFrame({'A': [9, 10],
'B': [11, 12]})
print(df1)
print(df2)
print(df3)
输出:
A B
0 1 3
1 2 4
A B
0 5 7
1 6 8
A B
0 9 11
1 10 12
我们可以使用 concatenate() 函数将它们合并成一个 DataFrame:
result = pd.concat([df1, df2, df3])
print(result)
输出:
A B
0 1 3
1 2 4
0 5 7
1 6 8
0 9 11
1 10 12
在这里,我们沿着默认的轴 0 进行拼接,得到了一个包含所有行的 DataFrame。
总结
Pandas 是一个强大的 Python 数据处理库,支持多种数据汇总、聚合的方式,包括聚合计算、pivot_table、groupby、merging 和 concatenation 等。在数据分析工作中,合理使用 Pandas 中的汇总方法可以提高工作效率,快速获取我们需要的数据信息。