python - Pandas:Dataframe itertuples 布尔系列 groupby 优化
问题描述
我是python新手。我有数据框(DF)示例:
ID | 类型 |
---|---|
1 | 一种 |
1 | 乙 |
2 | C |
2 | 乙 |
我想按 id 添加列示例 A_flag 组。最后我有数据框(DF):
ID | 类型 | 一只旗 |
---|---|---|
1 | 一种 | 1 |
1 | 乙 | 1 |
2 | C | 0 |
2 | 乙 | 0 |
我可以分两步做到这一点:
DF['A_flag_tmp'] = [1 if x.type=='A' else 0 for x in DF.itertuples()]
DF['A_flag'] = DF.groupby(['id'])['A_flag_tmp'].transform(np.max)
它正在工作,但对于大数据框来说非常慢。有什么办法可以优化这种情况吗?感谢帮助。
解决方案
通过替换您的第一步以通过 Pandas 内置函数生成布尔系列,将使用慢速迭代编码的代码更改为快速矢量化编码,例如
df['type'].eq('A')
然后,您可以将其附加到第二步的 groupby 语句中,如下所示:
df['A_flag'] = df['type'].eq('A').groupby(df['id']).transform('max').astype(int)
结果
print(df)
id type A_flag
0 1 A 1
1 1 B 1
2 2 C 0
3 2 B 0
一般来说,如果你有更复杂的条件,你也可以用矢量化的方式定义它,例如。通过以下方式定义布尔系列m
:
m = df['type'].eq('A') & df['type1'].gt(1) | (df['type2'] != 0)
然后,在步骤 2 中使用它,如下所示:
m.groupby(df['id']).transform('max').astype(int)
推荐阅读
- sql-server - T-SQL 检查数据是否在范围内,然后从表 A 中选择记录
- java - 带有 Jetty 的 Java 1.7 的 Kafka 版本
- docker - Raspberry Pi 4B ... 由于 aufs 导致 docker 无法运行的问题
- python - 根据来自另一个数据帧的值替换数据帧的值
- pandas - 将列标题转换为行
- sql - 寻求关于Left join的建议
- bash - 从逗号分隔的文件中删除主机
- asp.net - ASP.NET 身份模拟失败的域管理员
- r - 如何修复 R 中缺少的颜色分配
- amazon-web-services - AWS - 为每个 API 调用常见任务 Lambda