智能风控 数据分析 groupby、apply、reset_index组合拳

目录

groupby——分组

 本例        

apply——对每个分组应用一个函数

等价用法

reset_index——重置索引

使用前​编辑

注意事项

groupby必须配合聚合函数、

关于agglist

一些groupby试验

1. groupby对象之后。sum(一个列名)

2. groupby对象之后。sum(2个列名)

 3. groupby对象之后。sum(空)​编辑

sum添加一个列明

一样,只有数字上榜​编辑 

sum添加俩列名​编辑

书上官方:apply后自己定义列名

是否有列表框住很重要 

其他用法

np。nansum

例axis=0 未指定列名,把他们放到了一个列表​编辑

axis=0,指定列名,只有这个咧

​编辑axis=1报错1啊​编辑 


 

df_g = df.groupby('uid')  # 按照uid进行分组
gn = pd.DataFrame()  # 创建一个空的DataFrame用于存储结果
for i in agg_list:  # 遍历agg_list列表if isinstance(i, str):  # 如果i是字符串类型tp = pd.DataFrame(df_g.groupby('uid').apply(lambda df: len(df[i])).reset_index())  # 对每个组应用lambda函数计算长度,并将索引重置tp.columns = ['uid', i + '_cnt']  # 设置列名if gn.empty == True:  # 如果gn为空gn = tp  # 将tp赋值给gnelse:gn = pd.merge(gn, tp, on='uid', how='left')  # 合并gn和tpelif isinstance(i, int):  # 如果i是整数类型tp = pd.DataFrame(df_g.groupby('uid').apply(lambda df: np.where(df[i] > 0, 1, 0).sum()).reset_index())  # 对每个组应用lambda函数计算满足条件的元素的和,并将索引重置tp.columns = ['uid', i + '_num']if gn.empty == True:gn = tpelse:gn = pd.merge(gn, tp, on='uid', how='left')elif isinstance(i, float):  # 如果i是浮点数类型tp = pd.DataFrame(df_g.groupby('uid').apply(lambda df: np.nansum(df[i])).reset_index())  # 对每个组应用lambda函数计算非NaN值的和,并将索引重置tp.columns = ['uid', i + '_tot']if gn.empty == True:gn = tpelse:gn = pd.merge(gn, tp, on='uid', how='left')elif isinstance(i, list):  # 如果i是列表类型tp = pd.DataFrame(df_g.groupby('uid').apply(lambda df: np.nanmean(df[i])).reset_index())  # 对每个组应用lambda函数计算平均值,并将索引重置tp.columns = ['uid', i + '_avg']if gn.empty == True:gn = tpelse:gn = pd.merge(gn, tp, on='uid', how='left')else:  # 其他情况tp = pd.DataFrame(df_g.groupby('uid').apply(lambda df: np.nanmax(df[i])).reset_index())  # 对每个组应用lambda函数计算最大值,并将索引重置tp.columns = ['uid', i + '_max']if gn.empty == True:gn = tpelse:gn = pd.merge(gn, tp, on='uid', how='left')

groupby——分组

groupby 是 pandas 库中一个非常重要的功能,它用于将数据分组并对每个组应用函数。groupby 的基本用法是将 DataFrame 分成多个组,每个组由一个或多个唯一值定义。

语法:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

关键参数:

  • by: 用于分组的键,可以是列名、列名的列表或一个返回分组键的函数。
  • axis: 指定分组是在哪个轴上进行的,默认为 0(行)。
  • as_index: 默认为 True,表示返回的 DataFrame 中的分组键作为索引。如果设置为 False,则分组键将作为列返回。
 本例        
df.groupby('uid')

这会按照 ‘uid’ 列的值对 DataFrame 进行分组。

apply——对每个分组应用一个函数

apply 函数用于对 DataFrame 中的每个组应用一个函数。这个函数可以是自定义的,也可以是 pandas 中的内置函数。

语法:

DataFrameGroupBy.apply(func, *args, **kwargs)

关键参数:

  • func: 应用于每个组的函数。

例子:

df_g.apply(lambda df: np.sum(df['value']))

这会对每个组应用一个 lambda 函数,计算 ‘value’ 列的总和。

返回这个函数的结果dataframe

等价用法

其中,.df_g.apply(lambda df: np.sum(df['value']))等价于groupby对象.sum(列名即“value”)

例pd.DataFrame(customers_df.groupby(["Time"]).sum('CustomerID'))

reset_index——重置索引

reset_index 用于重置 DataFrame 的索引,或者将索引的级别转换为列。这在 groupby 操作后特别有用,因为 groupby 默认会将分组键作为索引。

语法:

DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

关键参数:

  • level: 如果是多级索引,可以指定要重置的级别。
  • drop: 如果为 True,则重置索引后,原始索引将不会作为列添加到 DataFrame 中。
  • inplace: 如果为 True,则直接在原始 DataFrame 上修改,不返回新的 DataFrame。

例子:

df_g.reset_index()

这会将分组后的 DataFrame 的索引重置,并将原来的索引作为 DataFrame 的一列。

返回重置后的dataframe

使用前

使用后 

结合以上三个功能,代码中的例子可以这样解释:

df_g = df.groupby('uid')  # 按照列 'uid' 对 DataFrame 进行分组
gn = pd.DataFrame()  # 创建一个空的 DataFrame 用于存储结果
for i in agg_list:  # 遍历一个聚合操作的列表# ... 对每个分组应用不同的聚合函数 ...tp = pd.DataFrame(df_g[i].apply(lambda df: np.sum(df)).reset_index())  # 应用聚合函数并重置索引# ... 合并结果到 gn DataFrame ...

在这个例子中,groupby 用于创建分组,apply 用于对每个分组执行聚合操作,而 reset_index 用于将聚合后的结果转换为 DataFrame,并保留原始的分组键作为一列。

注意事项

groupby必须配合聚合函数、

聚合函数可以是groupby对象后面。后缀

、也可以是。apply自定义

当你使用 pd.DataFrame(customers_df.groupby(['Time', "CustomerID"])) 时,你实际上是将 groupby 对象转换成了一个 DataFrame。groupby 对象本身是一个中间对象,用于表示分组操作,它包含了原始 DataFrame 的分组信息,但并不包含聚合后的结果。

import pandas as pd# 客户信息 DataFrame
customers_df = pd.DataFrame({'CustomerID': [1, 2, 3, 4],'CustomerName': ['Alice', 'Bob', 'Charlie', 'David'],'Time': [10, 20, 10, 40]
})# 将 groupby 对象转换为 DataFrame
grouped_df = pd.DataFrame(customers_df.groupby(['Time', "CustomerID"]))print(grouped_df)

输出将是一个包含两个列的 DataFrame,这两个列是 'Time' 和 'CustomerID',它们表示分组键。这个 DataFrame 的每一行代表一个唯一的分组。但是,由于没有应用任何聚合函数,这个 DataFrame 不会包含任何关于分组内容的聚合信息。

输出看起来像这样:

       Time  CustomerID
0 10      1          1
1 20      2          2
2 10      3          3
3 40      4          4

解释:

  • groupby(['Time', "CustomerID"]) 创建了一个分组对象,这个对象根据 ‘Time’ 和 ‘CustomerID’ 的每个唯一组合对数据进行分组。
  • 由于没有指定聚合函数,转换成 DataFrame 后,它只是显示了分组键的组合,并没有显示每个组中的数据。
  • 在这个特定的例子中,由于 ‘CustomerID’ 是唯一的,所以每个 ‘Time’ 和 ‘CustomerID’ 的组合都是唯一的,因此这个操作并没有实际上的分组效果,它只是简单地展示了每一行数据的 ‘Time’ 和 ‘CustomerID’。

如果你想要查看每个组中的数据,你应该在 groupby 后面应用聚合函数,例如 .size().sum().mean() 等,然后可能需要使用 .reset_index() 来将结果转换成一个 DataFrame。例如:

grouped_df = customers_df.groupby(['Time', "CustomerID"]).size().reset_index(name='Count')
print(grouped_df)

这将输出每个分组中的元素数量。

关于agglist

在Python中,当你在循环中使用for i in agg_list:时,agg_list通常是包含要处理的项或值的列表。在这个上下文中,agg_list可能包含一些聚合函数的名字或者是其他与数据处理相关的参数。具体来说,这取决于你正在进行的任务和你如何定义和使用agg_list

例如,如果你的程序涉及到数据分析,并且你想对不同列的数据进行某种形式的聚合(如求和、平均值等),那么agg_list可能会包含字符串形式的函数名称,如['sum', 'mean'],然后在循环内部对这些函数进行处理。

再举一个具体的例子,假设你有如下代码片段:

python

复制

agg_list = ['sum', 'mean']
dataframe = pd.DataFrame(...)  # 假设这是一个已经存在的DataFramefor func_name in agg_list:if func_name == 'sum':result = dataframe.sum()elif func_name == 'mean':result = dataframe.mean()# ... 其他可能的聚合函数处理 ...print(f"The {func_name} of the data is: {result}")

在这个例子中,agg_list就是一个包含字符串的列表,其中每个字符串代表一种聚合函数的名称。通过遍历这个列表,我们可以依次调用相应的聚合函数来处理数据。

总结一下,agg_list通常是一个列表,其中包含你要执行的某些操作的相关信息,如函数名称、参数等。具体的内容取决于你的编程需求和上下文。

书上:agg_list='oil_amount','discount_amount','sale_amount','amount',,'pay_amount','coupon_amount'等等。并不是前面所说的sum average之流

一些groupby试验

1. groupby对象之后。sum(一个列名)

仅显示为数字的列,name这列没写,并且另一列也作用了这个sum函数,即使没有写这一列的名字

2. groupby对象之后。sum(2个列名)

比1多了name一列,三列统统使用了sum操作,name是字符串的相加

 3. groupby对象之后。sum(空)

与1相同的结果,name又没了 

sum添加一个列明

一样,只有数字上榜 

sum添加俩列名

 2or3结果一样,name上榜

这个用法似乎不太正规

书上官方:apply后自己定义列名

这个结合apply及lambda自定义函数的方法会丢失列名仅有此列

是否有列表框住很重要 

name赫然在列

name消失 。且保留有其他数字的列

哪怕是只有一个列名的列表

其他用法

np。nansum

只能给他一列,多了会报错。 

np.nanmin 是 NumPy 库中的一个函数,

——忽略nan的某函数们,具体有nanmin nanmax nanvar nansum nanmean

他们通常作用在一维nparray上

如果用到多维,需要指定axis

例axis=0 未指定列名,把他们放到了一个列表

axis=0,指定列名,只有这个咧

axis=1报错1啊 

用于计算数组中非 NaN (Not a Number) 值的最小值。当数组中包含 NaN 值时,标准的 min 函数会返回 NaN,而 np.nanmin 会忽略这些 NaN 值并返回剩余非 NaN 值中的最小值。

以下是 np.nanmin 的基本用法:

import numpy as np# 创建一个包含 NaN 值的数组
arr = np.array([1, 2, np.nan, 4, np.nan, 6])# 使用 np.nanmin 计算非 NaN 值的最小值
min_value = np.nanmin(arr)print(min_value)  # 输出: 1

以下是 np.nanmin 的一些其他特性:

  • 它可以接受一个 axis 参数,用于计算指定轴上的最小值。
  • 它可以接受一个 out 参数,用于指定输出数组。

例子:

# 创建一个二维数组
arr_2d = np.array([[1, 2, np.nan], [np.nan, 4, 6], [7, np.nan, 9]])# 计算每一列的非 NaN 最小值
min_values_per_column = np.nanmin(arr_2d, axis=0)print(min_values_per_column)  # 输出: [1 2 6]# 计算每一行的非 NaN 最小值
min_values_per_row = np.nanmin(arr_2d, axis=1)print(min_values_per_row)  # 输出: [1 4 7]

在这个例子中,axis=0 表示沿着列的方向计算最小值,而 axis=1 表示沿着行的方向计算最小值。np.nanmin 会自动忽略每列或每行中的 NaN 值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)和 superset安装MySQL报错解决 解决方法(2025.1.23解决) 0.卸载之前安装好的Superset -- 退出当前环境 conda deactivate-- 卸载Superset conda remove -n sup…

linux-mysql在centos7安装和基础配置

1.安装mysql数据库 1.使用官网安装 1.检查是否存在mysql的分支mariadb [rootlocalhost ~]# rpm -qa |grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [rootlocalhost ~]# 2.卸载这个分支包 [rootlocalhost ~]# rpm -qa | grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 …

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

移动端VR处理器和传统显卡的不同

骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程,而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下(如移动端 XR 设备)实现高性能和低功耗的平衡。以下是具体的分析: 1. AI 驱动的渲染…

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,…

Git 小白入门教程

🎯 这篇文章详细介绍了版本控制的重要性,特别是通过Git实现的分布式版本控制相对于SVN集中式控制的优势。文章首先解释了版本控制的基本概念,强调了在文档或项目多版本迭代中备份与恢复任意版本的能力。接着,重点阐述了Git的历史背…

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…

【二叉树的深搜】二叉树剪枝

文章目录 814. 二叉树剪枝解题思路:深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 ​ 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 ​ 返回移除了所有不包含 1 的子树的原二叉树。 ​ 节点…

CSS实现实现票据效果 mask与切图方式

一、“切图”的局限性 传统的“切图”简单暴力,但往往缺少适应性。 适应性一般有两种,一是尺寸自适应,二是颜色可以自定义。 举个例子,有这样一个优惠券样式 关于这类样式实现技巧,之前在这篇文章中有详细介绍: CSS 实现优惠券的技巧 不过这里略微不一样的地方是,两个…

C语言数组详解:从基础到进阶的全面解析

在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…

Vue2 项目二次封装Axios

引言 在现代前端开发中,HTTP请求管理是构建健壮应用的核心能力之一。Axios作为目前最流行的HTTP客户端库,其灵活性和可扩展性为开发者提供了强大的基础能力。 1. 为什么要二次封装Axios? 1.1 统一项目管理需求 API路径标准化:…

Jmeter 动态参数压力测试时间段预定接口

🎯 本文档详细介绍了如何使用Apache JMeter进行压力测试,以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求,利用CSV文件动态配置时间段ID和用户token,确保了测试数据的真实性和有效性。文档中还…

Unity常用特性(Attribute)用法

一.UnityEngine命名空间 1.[Header(string)] inspector面板上给显示的字段上加一个描述 通常情况下,用于在 Inspector 窗口中创建字段的逻辑分组 public class AttributeTest : MonoBehaviour {[Header("public_field_num")]public int num; }2.[Tool…

vue项目的创建

运行第一个vue-cli应用程序 创建一个基于webpack模板的vue应用程序 vue init webpack 项目名根据自己需求选择 创建好之后如下 运行 cd vue01npm run dev运行之后如下 复制访问地址 : http://localhost:8080 停止服务 两次ctrlC 或者 一次ctrlc然后y idea中使用…

【CS61A 2024秋】Python入门课,全过程记录P3(Week5 Sequences开始,更新于2025/1/23)

文章目录 关于基本介绍👋新的问题Week5Mon Sequences阅读材料 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见🤝。如果读者想和我交个朋友可以加我好友(见主页or个人博客&#xff0…

android手机应用连接热点后无法进行tcp连接

你在WifiNetworkSpecifer连接回调onavaliable里,再次调用bindProcessToNetwork试试,我这边模拟了一下,是可以建立tcp连接的 你的那个应用我一直没编译成功,你试试吧,应该这样是可以的 另一个同事找到了类似的方法&…

【华为路由的arp配置】

华为路由的arp配置 ARP:IP地址与MAC地址的映射。 R1: g0/0/0:10.1.1.254/24 g0/0/1:10.1.2.254/24 PC1: 10.1.1.1/16 PC2: 10.1.1.2/16 PC3: 10.1.2.3/16 动态ARP 查看PC1的arp表,可以看到,列表为空。 查看R1的arp表 在PC3上ping命令测…

SPDK vhost介绍

目录 1. vhost技术的背景与动机Virtio 介绍virtio-blk数据路径为例 2. vhost技术的核心原理2.1 vhost-kernel2.2 vhost-user举例 2.3 SPDK vhostvhost的优势IO请求处理数据传输控制链路调整 3. SPDK vhost的实现与配置3.1 环境准备3.2 启动SPDK vhost服务3.3 创建虚拟块设备3.4…

电容的一些常用数值

如果是滤高频信号的小电容一般采用100nF 如果是滤低频信号的大电容一般采用10uF(10000nF) 比如这个LDO降压 两个一起用滤波效果会更好 如果想要供电引脚悬空,按理不能悬空,所以应该接大电阻接地,一般采用5.1KΩ 比如这个6Pin USB-TypeC的…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…