我有一个表,其中有近 3100 万条记录。
大约有 10 列,其中两列是卡号和交易状态。每张卡片可以有多行。所以可能有 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'})

最佳答案

您可以使用 GroupBy card_id 并将 transform 与 lambda 表达式一起用于 sum status 的次数等于 Ynum_approvedNnum_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

关于python - 将每个组的值的出现次数作为单独的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53922555/

10-12 18:36