如何按列分组然后计算列的百分比

时间:2018-03-09 16:18:07

标签: python pandas group-by pandas-groupby

我遇到一个小组的麻烦,然后试图计算出纳员和信用卡使用的时间。

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

3 个答案:

答案 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()然后你需要做什么操作