Fork me on GitHub

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

Pandas分组统计

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

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

模拟数据1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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出现了两次,防止数据不规范。写了一个循环来进行判断:

1
2
3
4
5
6
7
8
9
# 写个循环判断是否有重复行的数据

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().

统计每个学生出现次数

统计某位同学的成绩次数

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

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

需要进行去重统计:

1
data.groupby("subject")["name"].nunique()  # 去重统计

模拟数据2

数据

1
2
3
4
5
6
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参数中的唯一值

1
type(df1)  # df1的类型是Series型数据

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

4、通过stack方法进行翻转

from_records方法

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

参数

1
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.

案例

使用的案例来自官网:

去重与汇总统计

比如对用户去重和金额汇总的同时统计方法:

1
2
3
4
5
import pandas as pd
import numpy as np

df.groupby('time').agg({'user':'nunique','amount':'sum'}).reset_index()
df

本文标题:pandas使用技巧-分组统计数据

发布时间:2021年03月06日 - 15:03

原始链接:http://www.renpeter.cn/2021/03/06/pandas%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7-%E5%88%86%E7%BB%84%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea