Pandas Python 中数据如何进行汇总?

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 中的汇总方法可以提高工作效率,快速获取我们需要的数据信息。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Pandas 教程