前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pandas使用技巧-分组统计数据

pandas使用技巧-分组统计数据

作者头像
皮大大
发布于 2021-03-07 09:51:49
发布于 2021-03-07 09:51:49
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

Pandas分组统计

本文介绍的是pandas库中如何实现数据的分组统计:

  • 不去重的分组统计,类似SQL中统计次数
  • 去重的分组统计,类型SQL的统计用户数,需要去重

模拟数据1

本文案例的数据使用的是numpy库随机生成数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name_list = ["小明","小红","张三","李四","王五","小孙","小周"]  # 姓名
subject_list = ["语文","数学","英文","生物","物理","地理",'化学']  # 科目
time_list = ['上','下']  # 上下学期
grade_list = [1,2,3,4,5,6]   # 几年级

# np.random.choice(list(range(50,101)),30) 同下效果
score_list = np.random.randint(50,100,30).tolist()   # 0-100之间选择30个数

data = pd.DataFrame({
    "name": np.random.choice(name_list, 30, replace=True),   # 默认也是放回抽样
    "subject": np.random.choice(subject_list, 30),
    "scoer": score_list,
    "time": np.random.choice(time_list, 30),
    "grade": np.random.choice(grade_list, 30)
})

data
检查数据是否重复

因为数据是随机生成的,我们需要检查是否有出现这种情况:name、subject、time、grade4个字段相同,但是score出现了两次,防止数据不规范。写了一个循环来进行判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 写个循环判断是否有重复行的数据

for i in range(len(data)):
    for j in range(len(data)):  # 当name、subject、time、grade相同的时候,分数却不同,这样的数据可能存在
        if data.iloc[i,0] == data.iloc[j,0] and data.iloc[i,1] == data.iloc[j,1] and data.iloc[i,3] == data.iloc[j,3] and data.iloc[i,4] == data.iloc[j,4] and i != j:
            print(data.iloc[i,])  # 如果存在,打印出来这样的数据
            print(j)   # 重复数据的时候j值
    print(i)  # 相同数据时候i值
    print("没有重复数据")

果然有上述不满足要求的数据:

报错解决

我们把小红的这物理学科在3年级下学期的成绩找出来:当使用and连接多个条件的时候会出现如下的报错!!!

将每个条件用()单独包裹起来,同时and需要改成&即可解决:

成功解决!这个报错是很常见的

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

统计每个学生出现次数

统计某位同学的成绩次数

  • 找出张三同学的全部成绩
  • 统计张三成绩出现的次数

统计每个科目有多少同学出现

需要进行去重统计:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data.groupby("subject")["name"].nunique()  # 去重统计

模拟数据2

数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd

df = pd.DataFrame({
    'group': [1, 1, 2, 3, 3, 3, 4],
    'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan]
})
分组统计方法1

直接使用groupby函数和nunique方法:

分组统计方法2

整体方法说明:

分步骤解释:

1、找出数据不是null的值

2、统计para参数中的唯一值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type(df1)  # df1的类型是Series型数据

3、使用from_records方法来生成数据

4、通过stack方法进行翻转

from_records方法

下面记录pandas中from_records方法的使用:

参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataFrame.from_records(data, index=None, exclude=None, columns=None, coerce_float=False, nrows=None)[source]

Convert structured or record ndarray to DataFrame. Creates a DataFrame object from a structured ndarray, sequence of tuples or dicts, or DataFrame.

案例

使用的案例来自官网:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-3-6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验