数据分析 — Pandas 分组聚合

这篇具有很好参考价值的文章主要介绍了数据分析 — Pandas 分组聚合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、函数应用和映射

1、apply

pandas.apply() 是 Pandas 库中的一个函数,用于在 DataFrame 或 Series 上应用自定义函数。这个函数可以沿着指定的轴(行或列)逐行或逐列地应用函数,从而实现对数据的定制化操作。

参数:

  • func(必需):这是要应用的函数,可以是一个 Python 函数、lambda 函数或可调用对象。这个函数将应用于 Series 或 DataFrame 的每个元素或行/列,具体取决于 axis 参数的设置。

  • axis(可选):指定函数应用的轴方向。有两个选项:

    • axis=0(默认值):将函数应用于每一列,即按列方向操作。

    • axis=1:将函数应用于每一行,即按行方向操作。

  • raw(可选):一个布尔值,用于控制是否将数据以 NumPy 数组的形式传递给函数。有两个选项:

    • raw=False(默认值):表示将数据以 Series 或 DataFrame 的形式传递给函数。
    • raw=True:表示数据以 NumPy 数组形式传递给函数,这在某些情况下可能提高性能。
  • result_type(可选):指定函数的返回类型。有两个选项:

    • expand(默认值):如果函数返回的是 Series,则将其扩展为 DataFrame。
    • reduce:如果函数返回的是标量(如一个数字),则返回一个标量;如果返回的是 Series,则返回一个 Series。
  • args(可选):一个元组,包含传递给函数的额外参数。这可以用来向函数传递额外的参数。

  • **kwds(可选):关键字参数,用于传递给函数的额外关键字参数。

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
print("原df\n", df)
# 原df
#     A   B
# 0  1  10
# 1  2  20
# 2  3  30
# 3  4  40
# 4  5  50

# 使用 lambda 函数将每个元素加倍
df['A2'] = df['A'].apply(lambda x: x * 2)
print("A列2倍处理后的df\n", df)
# A列2倍处理后的df
#     A   B  A2
# 0  1  10   2
# 1  2  20   4
# 2  3  30   6
# 3  4  40   8
# 4  5  50  10

# 增加新列 Row_Sum,值为A列和B列对应位置相加的结果
def row_sum(row):
    return row['A'] + row['B']
df['Row_Sum'] = df.apply(row_sum, axis=1)
print("增加AB两列和后的df\n", df)
# 增加AB两列和后的df
#     A   B  A2  Row_Sum
# 0  1  10   2       11
# 1  2  20   4       22
# 2  3  30   6       33
# 3  4  40   8       44
# 4  5  50  10       55

2、map

pandas.map() 是 Pandas 库中的一个方法,主要用于对 Series 中的每个元素应用一个函数或一个字典,将每个元素映射到另一个值上。它可以用于进行元素级的转换,从而创建新的 Series。

参数:

  • arg(必需):这是映射函数、字典或其它可映射对象,用于将 Series 中的元素映射到新的值。可以是以下几种类型:
    • 一个函数:将应用于 Series 中的每个元素,函数的返回值将作为新的值。
    • 一个字典:将 Series 中的值与字典中的键进行匹配,并将对应的值用作新的值。
    • 一个 Series 或其它可映射的 Pandas 对象:将 Series 中的值与可映射对象中的索引或标签匹配,并将对应的值用作新的值。
  • na_action (可选):指定对于 Series 中的缺失值如何处理。有两个选项:
    • ignore(默认值):忽略缺失值,不进行映射,将缺失值保留不变。
    • raise:如果 Series 中存在缺失值,则引发异常。
import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 Series
data = {'A': ['apple', 'banana', 'cherry', 'date']}
s = pd.Series(data['A'])
# 使用字典映射元素到新的值
dict1 = {'apple': 'fruit', 'banana': 'fruit', 'cherry': 'fruit'}
s_mapped = s.map(dict1)
print(s_mapped)
# 0    fruit
# 1    fruit
# 2    fruit
# 3      NaN
# dtype: object

# 使用函数映射元素到新的值
def func(x):
    if x in ['apple', 'banana', 'cherry']:
        return 'fruit'
    else:
        return 'other'

s_mapped2= s.map(func)
print(s_mapped2)
# 0    fruit
# 1    fruit
# 2    fruit
# 3    other
# dtype: object

二、汇总和描述统计

1、计算平均值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算平均值
mean_A = df['A'].mean()
mean_B = df['B'].mean()
print(f'A列平均值: {mean_A}')  # A列平均值: 3.0
print(f'B列平均值: {mean_B}')  # B列平均值: 30.0

2、计算中位数

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算中位数
median_A = df['A'].median()
median_B = df['B'].median()
print(f'A列中位数: {median_A}')  # A列中位数: 3.0
print(f'B列中位数: {median_B}')  # B列中位数: 30.0

3、计算总和

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算总和
sum_A = df['A'].sum()
sum_B = df['B'].sum()
print(f'A列求和: {sum_A}')  # A列求和: 15
print(f'B列求和: {sum_B}')  # B列求和: 150

4、找到最小值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 找到最小值
min_A = df['A'].min()
min_B = df['B'].min()
print(f'A列最小值: {min_A}')  # A列最小值: 1
print(f'B列最小值: {min_B}')  # B列最小值: 10

5、找到最大值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 找到最大值
max_A = df['A'].max()
max_B = df['B'].max()
print(f'A列最大值: {max_A}')  # A列最大值: 5
print(f'B列最大值: {max_B}')  # B列最大值: 50

6、计算标准差

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算标准差
std_A = df['A'].std()
std_B = df['B'].std()
print(f'A列标准差: {std_A}')  # 标准差A: 1.5811388300841898
print(f'B列标准差: {std_B}')  # 标准差B: 15.811388300841896

7、计算方差

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算方差
var_A = df['A'].var()
var_B = df['B'].var()
print(f'A列方差: {var_A}')  # A列方差: 2.5
print(f'B列方差: {var_B}')  # B列方差: 250.0

8、计算非空值的数量

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算非空值的数量
count_A = df['A'].count()
count_B = df['B'].count()
print(f'A列非空值数量: {count_A}')  # A列非空值数量: 5
print(f'B列非空值数量: {count_B}')  # B列非空值数量: 5

9、生成摘要统计信息

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 生成摘要统计信息
summary_A = df['A'].describe()
summary_B = df['B'].describe()
print(f'A列概览:\n{summary_A}')
# A列概览:
# count    5.000000
# mean     3.000000
# std      1.581139
# min      1.000000
# 25%      2.000000
# 50%      3.000000
# 75%      4.000000
# max      5.000000
# Name: A, dtype: float64
print(f'B列概览:\n{summary_B}')
# B列概览:
# count     5.000000
# mean     30.000000
# std      15.811388
# min      10.000000
# 25%      20.000000
# 50%      30.000000
# 75%      40.000000
# max      50.000000
# Name: B, dtype: float64

10、计算唯一值的频率

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# 计算唯一值的频率
value_counts_A = df['A'].value_counts()
value_counts_B = df['B'].value_counts()
print(f'A列各值计数:\n{value_counts_A}')
# A列各值计数:
# A
# 1    1
# 2    1
# 3    1
# 4    1
# 5    1
# Name: count, dtype: int64
print(f'B列各值计数:\n{value_counts_B}')
# B列各值计数:
# B
# 10    1
# 20    1
# 30    1
# 40    1
# 50    1
# Name: count, dtype: int64

三、str 属性

作用是对元素级的数据(单元格数据)进行处理,能处理的是字符串

1、str.len()

计算每个字符串的长度

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie']}
df = pd.DataFrame(data)
df['name_length'] = df['name'].str.len()
print(df)
#       name  name_length
# 0    Alice            5
# 1      Bob            3
# 2  Charlie            7

2、str.lower() 和 str.upper()

str.lower():将字符串转换为小写

str.upper():将字符串转换为大写

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie']}
df = pd.DataFrame(data)
df['name_lower'] = df['name'].str.lower()
df['name_upper'] = df['name'].str.upper()
print(df)
#       name name_lower name_upper
# 0    Alice      alice      ALICE
# 1      Bob        bob        BOB
# 2  Charlie    charlie    CHARLIE

3、str.replace()

替换字符串中的子字符串

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie']}
df = pd.DataFrame(data)
df['name_replaced'] = df['name'].str.replace('a', 'X')
print(df)
#       name name_replaced
# 0    Alice         Alice
# 1      Bob           Bob
# 2  Charlie       ChXrlie

4、str.strip()、str.lstrip() 和 str.rstrip()

str.strip():删除字符串两侧的空格

str.lstrip():删除字符串左侧的空格

str.rstrip():删除字符串右侧的空格

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['  Alice  ', '  Bob  ', '  Charlie  ']}
df = pd.DataFrame(data)
df['name_strip'] = df['name'].str.strip()
df['name_lstrip'] = df['name'].str.lstrip()
df['name_rstrip'] = df['name'].str.rstrip()
print(df)
#           name name_strip name_lstrip name_rstrip
# 0      Alice        Alice     Alice         Alice
# 1        Bob          Bob       Bob           Bob
# 2    Charlie      Charlie   Charlie       Charlie

5、str.split()

拆分字符串为列表

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie']}
df = pd.DataFrame(data)
df['name_split'] = df['name'].str.split(' ')
print(df)
#       name name_split
# 0    Alice    [Alice]
# 1      Bob      [Bob]
# 2  Charlie  [Charlie]

6、str.startswith() 和 str.endswith()

str.startswith():检查字符串是否以特定前缀开头

str.endswith():检查字符串是否以特定后缀开头

import pandas as pd  # 导入 Pandas 库并使用别名 pd
# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie']}
df = pd.DataFrame(data)
df['name_startswith'] = df['name'].str.startswith('A')
df['name_endswith'] = df['name'].str.endswith('e')
print(df)
#       name  name_startswith  name_endswith
# 0    Alice             True           True
# 1      Bob            False          False
# 2  Charlie            False           True

7、str.count()

用于计算字符串中非空元素的方法

import pandas as pd  # 导入 Pandas 库并使用别名 pd

# 创建一个示例 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie', None, 'David']}
df = pd.DataFrame(data)
count_substring = df['name'].str.count('a')
print(count_substring)
# 0    0.0
# 1    0.0
# 2    1.0
# 3    NaN
# 4    1.0
# Name: name, dtype: float64
print(count_substring.sum())  # 2.0

四、分组聚合

groupby() 是 Pandas 中一个方法,用于将数据按照一个或多个列的值分组,然后对每个分组应用聚合函数

参数:

  • by(必需):指定分组的列名或列名的列表。可以是单个列名的字符串,也可以是列名的列表,以按多列分组。这是 groupby() 方法的关键参数。
  • axis(可选):指定分组的轴方向,有两个选项:
    • axis=0(默认值):按行分组。
    • axis=1:按列分组。
  • level(可选):如果输入 DataFrame 包含多层索引,则可以指定要分组的索引级别。
  • as_index(可选):默认情况下,groupby() 结果的分组键会成为结果 DataFrame 的索引。设置 as_index=False 可以防止这种情况发生,分组键将保留为列而不是索引。
  • sort(可选):默认情况下,分组键会根据分组键的值进行排序。设置 sort=False 可以禁用排序,可能提高性能。
import pandas as pd  # 导入 Pandas 库并使用别名 pd

# 创建一个示例 DataFrame
data = {'Category': ['A', 'B', 'A', 'B', 'A'],'Value': [10, 20, 15, 25, 30]}
df = pd.DataFrame(data)
# 按 Category 列分组,并计算每个分组的平均值
grouped = df.groupby(by='Category')
res1 = grouped.mean()
print(res1)
#               Value
# Category
# A         18.333333
# B         22.500000

# 使用多列进行分组
grouped = df.groupby(by=['Category', 'Value'])
# 聚合求和
res2 = grouped.sum()
print(res2)
# Empty DataFrame
# Columns: []
# Index: [(A, 10), (A, 15), (A, 30), (B, 20), (B, 25)]

# 使用自定义聚合函数
def custom_agg(x):
  return x.max() - x.min()
res3 = df.groupby(by='Category').agg(custom_agg)
print(res3)
#           Value
# Category
# A            20
# B             5

五、透视表

pivot_table() 是 Pandas 中用于创建数据透视表的方法。数据透视表是一种用于总结和聚合数据的强大工具,可以根据一个或多个列对数据进行重新排列,以便更容易进行分析。

参数:

  • data(必需):要创建数据透视表的 DataFrame。
  • values(必需):要聚合的列名或列名的列表。这是要计算统计量的列。
  • index(可选):一个或多个列名,用于作为数据透视表的行索引(行标签)。
  • columns(可选):一个或多个列名,用于作为数据透视表的列索引(列标签)。
  • aggfunc(可选):要应用于 values 中列的聚合函数,可以是内置聚合函数(例如 ‘sum’、‘mean’、‘count’ 等)或自定义函数。默认情况下,使用 ‘mean’。
  • fill_value(可选):替代结果表中的缺失值。
  • margins(可选):添加边际汇总,生成汇总统计信息。
  • dropna(可选):默认情况下,如果所有条目都是 NaN,则删除相应的行。设置为 False 可以保留包含 NaN 值的行。
import pandas as pd  # 导入 Pandas 库并使用别名 pd

# 创建一个示例 DataFrame
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03'],'Category': ['A', 'B', 'A', 'B', 'A'],'Value': [10, 20, 15, 25, 30]}
df = pd.DataFrame(data)
print(df)
#          Date Category  Value
# 0  2023-01-01        A     10
# 1  2023-01-01        B     20
# 2  2023-01-02        A     15
# 3  2023-01-02        B     25
# 4  2023-01-03        A     30

# 创建数据透视表,聚合'Value'列,行索引为'Date',列索引为'Category',默认聚合函数为均值
pivot = pd.pivot_table(df, values='Value', index='Date', columns='Category')
print(pivot)
# Category       A     B
# Date
# 2023-01-01  10.0  20.0
# 2023-01-02  15.0  25.0
# 2023-01-03  30.0   NaN

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~文章来源地址https://www.toymoban.com/news/detail-827683.html

到了这里,关于数据分析 — Pandas 分组聚合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据分析 - 基础入门之pandas篇①】- pandas介绍

    pandas 是 Python 的 核心数据分析支持库 ,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。 pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具 ,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年

    2024年02月13日
    浏览(41)
  • 【头歌】——数据分析与实践-python-Pandas 初体验-Pandas数据取值与选择-Pandas进阶

    第1关 了解数据处理对象–Series 第2关 了解数据处理对象-DataFrame 第3关 读取 CSV 格式数据 第4关 数据的基本操作——排序 第5关 数据的基本操作——删除 第6关 数据的基本操作——算术运算 第7关 数据的基本操作——去重 第8关 数据重塑 第1关 Series数据选择 第2关 DataFrame数据

    2024年01月22日
    浏览(136)
  • 【数据分析 - 基础入门之pandas篇②】- pandas数据结构——Series

    大家好!我是一朵向阳花(花花花),本期跟大家分享的知识是 pandas 数据结构——Series。 作者的【 Python 数据分析】专栏正在火热更新中,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 ! 每日金句分享: 愿你有一天,能和你最重要的人重逢。』—— 艾拉「可塑性记忆

    2024年02月13日
    浏览(39)
  • 【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame

    大家好!我是一朵向阳花(花花花)🍭,本期跟大家分享的知识是 pandas 数据结构——DataFrame。 作者的【 Python 数据分析】专栏正在火热更新中🔥,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 ! 每日金句分享: 慢慢来,谁还没有一个努力的过程。』—— pony「网易云

    2024年02月16日
    浏览(43)
  • pandas数据分析之数据绘图

    一图胜千言,将信息可视化(绘图)是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外,还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文将通过实例介绍pandas的数据绘图

    2024年02月10日
    浏览(37)
  • 数据分析 — Pandas 数据处理

    Pandas (Python Data Analysis Library)是一个基于 NumPy 的 数据分析工具 ,专为解决数据分析任务而创建。它汇集了大量库和一些标准的数据模型,可以更高效地操作大型数据集。 数据结构: Pandas 提供了两种主要的数据结构,即 Series 和 DataFrame ,用于处理 一维和二维 数据。 标签

    2024年02月22日
    浏览(53)
  • 【数据分析】pandas (三)

    在这里,我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象: index = pd.date_range(“1/1/2000”, periods=8) s = pd.Series(np.random.randn(5), index=[“a”, “b”, “c”, “d”, “e”]). df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=[“A”, “B”, “C”]) 要查看一个Seri

    2024年02月13日
    浏览(36)
  • 数据分析| Pandas200道练习题,使用Pandas连接MySQL数据库

    通过pandas实现数据库的读,写操作时,首先需要进行数据库的连接,然后通过调用pandas所提供的数据库读写函数与方法来实现数据库的读写操作。 Pandas提供了3个函数用于数据库的读操作 read_sql_query() 可以实现对数据库的查询操作,但是不能直接读取数据库中的某个表,需要

    2024年01月16日
    浏览(51)
  • 《Python数据分析技术栈》第06章使用 Pandas 准备数据 01 Pandas概览(Pandas at a glance)

    《Python数据分析技术栈》第06章使用 Pandas 准备数据 01 Pandas概览(Pandas at a glance) Wes McKinney developed the Pandas library in 2008. The name (Pandas) comes from the term “Panel Data” used in econometrics for analyzing time-series data. Pandas has many features, listed in the following, that make it a popular tool for data wrang

    2024年01月23日
    浏览(44)
  • 数据分析Pandas专栏---第三章<Pandas合并list和字典>

    在处理数据时,经常会遇到需要操作和转换DataFrame的场景。特别是当涉及到从单个或多个字典合成DataFrame,以及合并多个DataFrame时,适当的方法和技巧可以极大地简化程序逻辑并提高代码的可读性与效率。此外,数据操作过程中,索引的正确管理是保持数据完整性的关键。本

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包