看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有时候我们要按整组的情况对原数据进行标注,就要用到窗口函数。今天我们看看如何使用 transform()
完成此类需求。
假定我们的数据如下:
import pandas as pd
df = pd.read_csv('https://gairuo.com/file/data/team.csv')
df = df.sample(n=10, random_state=123)
df
'''
name team Q1 Q2 Q3 Q4
8 Reddie D 64 93 57 72
70 Nathan A 87 77 62 13
82 Finn E 4 1 55 32
28 Daniel C 50 50 72 61
63 Alex D 14 70 55 87
0 Liver E 89 21 24 64
5 Harlie C 24 13 87 43
50 Jenson B 66 77 88 74
81 Ellis C 34 34 77 42
4 Oah D 65 49 61 86
'''
现在需要增加一个标列,如果按 team 分组中,Q1 到 Q4 列的数字中有大于 90 的值,就标记为 1,否则为 0。
先筛选列名有 Q 字符串的列,这样就只剩下要计算的数字列了,接着比较是否大于 90,得到布尔矩阵,然后再用 any()
按行判断是否此行有无大于 90 的值。
最后按 team 分组,传入 any 到窗口函数中,就得到了结果。
根据思路,代码如下:
df['flag'] = (
df.filter(regex=r'^Q.+')
.gt(90).any(axis=1)
.groupby(df.team)
.transform('any')
.astype(int)
)
df
'''
name team Q1 Q2 Q3 Q4 flag
8 Reddie D 64 93 57 72 1
70 Nathan A 87 77 62 13 0
82 Finn E 4 1 55 32 0
28 Daniel C 50 50 72 61 0
63 Alex D 14 70 55 87 1
0 Liver E 89 21 24 64 0
5 Harlie C 24 13 87 43 0
50 Jenson B 66 77 88 74 0
81 Ellis C 34 34 77 42 0
4 Oah D 65 49 61 86 1
'''
这样就完成了需求。
(完)
更新时间:2024-08-19 14:31:30 标签:pandas python 分组 标记