我遇到一个小组的麻烦,然后试图计算出纳员和信用卡使用的时间。
DF
Date Cashier Creditcard_number
2017-01-01 Steve Rogers 1111-1111-1111-1111
2017-01-03 Steve Green 1111-1111-1121-1111
2017-01-04 Steve Green 1111-2211-1111-1111
2017-01-02 Steve Rogers 1111-1111-1111-1111
目标
Creditcard_number Cashier Times_Used_By_cashier
1111-1111-1111-1111 Steve Rogers 1/2
1111-1111-1121-1111 Steve Green 1/1
1111-2211-1111-1111 Steve Green 1/1
修改
DF
Date Cashier Creditcard_number
2017-01-01 Steve Rogers 1111-1111-1111-1111
2017-01-02 Steve Green 1111-1111-1111-1111
2017-01-03 Steve Green 1111-1111-1121-1111
2017-01-04 Steve Green 1111-2211-1111-1111
2017-01-02 Steve Rogers 1111-1111-1111-1111
目标
Creditcard_number Cashier Times_Used_By_cashier
1111-1111-1111-1111 Steve Rogers 2/3
1111-1111-1121-1111 Steve Green 1/1
1111-2211-1111-1111 Steve Green 1/1
答案 0 :(得分:3)
您可以执行两项groupby
+ count
操作,然后执行与索引对齐的部门:
i = df.groupby(['Creditcard_number']).Cashier.count()
j = df.groupby(['Cashier', 'Creditcard_number']).Cashier.count()
(j / i).reset_index(name='Times_Used_By_Cashier')
Cashier Creditcard_number Times_Used_By_Cashier
0 Steve Green 1111-1111-1111-1111 0.5
1 Steve Green 1111-1111-1121-1111 1.0
2 Steve Green 1111-2211-1111-1111 1.0
3 Steve Rogers 1111-1111-1111-1111 0.5
或者,如果您希望结果为"x/y"
形式(作为字符串),那么 -
(j.astype(str) + '/' + i.astype(str)).reset_index(name='Times_used_by_cashier')
Cashier Creditcard_number Times_used_by_cashier
0 Steve Green 1111-1111-1111-1111 1/2
1 Steve Green 1111-1111-1121-1111 1/1
2 Steve Green 1111-2211-1111-1111 1/1
3 Steve Rogers 1111-1111-1111-1111 1/2
答案 1 :(得分:3)
尝试匹配上面的输出列表..
df.groupby('Creditcard_number').agg({'Cashier':'first','Creditcard_number':lambda x : x.nunique()/len(x)})
Out[20]:
Cashier Creditcard_number
Creditcard_number
1111-1111-1111-1111 SteveRogers 0.5
1111-1111-1121-1111 SteveGreen 1.0
1111-2211-1111-1111 SteveGreen 1.0
或
s=df.groupby('Creditcard_number').agg({'Cashier':['first','nunique']})
s.columns=s.columns.droplevel(0)
s.assign(nunique='1/'+s['nunique'].astype(str))
Out[28]:
first nunique
Creditcard_number
1111-1111-1111-1111 SteveRogers 1/2
1111-1111-1121-1111 SteveGreen 1/1
1111-2211-1111-1111 SteveGreen 1/1
答案 2 :(得分:-3)
你可以做df.groupby(Credit_Card).count()
然后你需要做什么操作