python - 每个组的值的出现计数作为单独的列
问题描述
我有一张有近 3100 万条记录的表。大约有 10 列,其中两列是卡号和 transaction_status。每张卡片可以有多行。所以可能有 2000 行同一张卡,每行作为具有相应状态的交易
transaction_Status 的值为“Y”/“N”。
我想使用 pandas 数据框在此表中添加另外两列“count_of_approved”、“count_of_rejected”。
我怎么做?到目前为止,我一直在使用 get_dummies() 和 merge(),但是这需要很多时间,更糟糕的是,会导致内存不足错误。
所以说我的输入如下:
trn_id | card_id | status
1 | c1 | Y
2 | c2 | Y
3 | c2 | N
4 | c3 | Y
5 | c3 | Y
我希望我的输出是
trn_id | card_id | status | num_approved | num_of_denied
1 | c1 | Y | 1 | 0
2 | c2 | Y | 1 | 1
3 | c2 | N | 1 | 1
4 | c3 | Y | 2 | 0
5 | c3 | Y | 2 | 0
我的代码如下所示:
import pandas as panda
a = panda.DataFrame({'id':[1,2,3],'c_id':[22,22,33], 'status':['Y','Y','N']})
temp = a.status.str.get_dummies()
a[['N','Y']]= temp
tt = a.groupby(['c_id'])['Y'].count()
tt=tt.reset_index()
yes_count_added = a.merge(tt,how='right',on='c_id')
yes_count_added.rename(columns = {'Y_y':'num_of_approved'})
解决方案
您可以使用lambda 表达式,其次数等于the或using :GroupBy
card_id
transform
sum
status
Y
num_approved
N
num_of_denied
eq
df['num_approved'] = df.groupby('card_id').status.transform(
lambda x: x.eq('Y').sum())
df['num_of_denied'] = df.groupby('card_id').status.transform(
lambda x: x.eq('N').sum())
trn_id card_id status num_approved num_of_denied
0 1 c1 Y 1 0
1 2 c2 Y 1 1
2 3 c2 N 1 1
3 4 c3 Y 2 0
4 5 c3 Y 2 0
推荐阅读
- jquery - 单击添加新行按钮第一行单选按钮值在 jquery 中未定义
- docker - 如何更改 Spring Cloud Stream Kafka binder 的目标?
- c# - 将此日期格式“2019-11-07T13:30:00+05:30”转换为UTC日期的最佳方法是什么?
- reactjs - ReactJS:如何在下拉菜单中执行多项选择?
- php - Laravel 最大验证对文件上传不起作用,我仍然可以上传大于限制的图像。为什么会这样?
- remote-server - 如何调试 rsyslog 到远程服务器的问题?
- amazon-web-services - 从 AWS DataLake 到 RDS 的 ETL
- angular - 刷新在 Angular 6 中加载的页面后,在路由上不加载外部 js
- python - pytorch和tensorflow中GRUCell函数的区别
- xcode - ld:警告:找不到选项“-F~/Documents/FacebookSDK”的目录-react-native-ios