我有一张桌子,上面有近3100万条记录。 大约有10列,其中两列是卡号和transaction_status。每张卡可以有多行。因此同一张卡可能有2000行,每一行都是具有相应状态的交易
transaction_Status的值为'Y'/'N'。
我想使用熊猫数据框在此表中添加另外两列“ count_of_approved”和“ count_of_rejected”。
我该怎么做? trn 到目前为止,我一直在使用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'})
答案 0 :(得分:4)
您可以GroupBy
card_id
并使用带有lambda表达式的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
答案 1 :(得分:4)
使用str.get_dummies
和一个groupby
进行通话以提高性能:
df.status.str.get_dummies().groupby(df.card_id).transform('sum')
N Y
0 0 1
1 1 1
2 1 1
3 0 2
4 0 2
v = (df.status
.str.get_dummies()
.groupby(df.card_id)
.transform('sum')
.rename({'Y': 'num_approved', 'N': 'num_denied'}, axis=1))
pd.concat([df, v], axis=1)
trn_id card_id status num_denied num_approved
0 1 c1 Y 0 1
1 2 c2 Y 1 1
2 3 c2 N 1 1
3 4 c3 Y 0 2
4 5 c3 Y 0 2
答案 2 :(得分:1)
您可以使用crosstab:
column_no=4
product=1
with open('data.txt') as f:
content = f.readlines()
for line in content:
line_list=line.strip().split(', ')
product*=int(line_list[column_no-1]) #indexing starts from 0
print(product)
输出
import pandas as pd
a = pd.DataFrame(
{'trn_id': [1, 2, 3, 4, 5],
'card_id': ['c1', 'c2', 'c2', 'c3', 'c3'],
'status': ['Y', 'Y', 'N', 'Y', 'Y']})
crosstab = pd.crosstab(a.card_id, a.status).reset_index(level=0).rename(
columns={'Y': 'num_approved', 'N': 'num_denied'})
print(pd.merge(a, crosstab, on='card_id'))