分组依据以及value_counts的工作方式

时间:2018-07-15 21:59:32

标签: python python-3.x pandas count pandas-groupby

我有一个包含以下数据的数据框

     idpresm  teamid competicion      fecha                          local  \
0    12345  dummy1      ECU D1 2018-07-07               Deportivo Cuenca   
1    12345  dummy1      ECU D1 2018-07-03  Liga Dep. Universitaria Quito   
2    12345  dummy1      ECU D1 2018-06-24           Universidad Catolica   
3    12345  dummy1      ECU D1 2018-06-18              Club Sport Emelec   
4    12345  dummy1      ECU D1 2018-06-12           Universidad Catolica   
5    12345  dummy1      ECU D1 2018-06-05                      Delfin SC   
6    12345  dummy1      ECU D1 2018-05-31       Sociedad Deportiva Aucas   
7    12345  dummy1      ECU D1 2018-05-26           Universidad Catolica   
8    12345  dummy1      ECU D1 2018-05-12           Universidad Catolica   
9    12345  dummy1      ECU D1 2018-05-05                         Macara   
10   12345  dummy1      ECU D1 2018-04-28           Universidad Catolica   
11   12345  dummy1      ECU D1 2018-04-21                 Guayaquil City   
12   12345  dummy1      ECU D1 2018-04-14           Universidad Catolica   
13   12345  dummy1      ECU D1 2018-04-07                 CD El Nacional   
14   12345  dummy1      ECU D1 2018-03-31           Universidad Catolica   
15   12345  dummy1      ECU D1 2018-03-25       Independiente Jose Teran   
16   12345  dummy1      ECU D1 2018-03-20           Universidad Catolica   
17   12345  dummy1      ECU D1 2018-03-10          Tecnico Universitario   
18   12345  dummy1      INT CF 2018-03-09                   Colchagua CD   
19   12345  dummy1      ECU D1 2018-03-04           Universidad Catolica   



      aw   homeha    line  awayha  r1  r3  
0   2.39    0.96       0    0.80   1   1  
1   3.79    0.85     0.5    0.91   2   1  
2   9.32    1.00     1.5    0.84   4   0  
3   5.80    0.99       1    0.85   2   3  
4   2.93    0.85   0/0.5    0.97   1   1  
5   3.86    1.04     0.5    0.80   5   2  
6   2.61    0.85       0    0.99   0   1  
7   3.32    1.04   0/0.5    0.80   1   1  
8   5.56    0.90       1    0.94   2   1  
9   2.82    0.70       0    1.16   1   2  
10  3.60    1.00     0.5    0.84   3   1  
11  2.20    1.04       0    0.80   1   1  
12  4.07    0.99     0.5    0.85   2   0  
13  2.77    0.97   0/0.5    0.85   0   0  
14  3.36    0.80     0.5    1.02   3   1  
15  6.11    0.97     0.5    0.85   2   1  
16  2.03    0.91  0/-0.5    0.85   2   0  
17  2.21    0.70  0/-0.5    1.13   0   2  
18  1.44     NaN     NaN     NaN   0   0  
19  2.76    0.80       0    1.02   1   2  

我要做的是按本地列gruopby,然后我打算获取列r1的平均值,为此,我执行以下操作

homedata.groupby('local')['r1'].agg({'media':np.average,'contador': lambda x: x.value_counts()})

我希望在'contador'中有一列整数。我得到的是这个

                                media      contador
local                                                
CD El Nacional                 0.000000             1
Club Sport Emelec              2.000000             1
Colchagua CD                   0.000000             1
Delfin SC                      5.000000             1
Deportivo Cuenca               1.000000             1
Guayaquil City                 1.000000             1
Independiente Jose Teran       2.000000             1
Liga Dep. Universitaria Quito  2.000000             1
Macara                         1.000000             1
Sociedad Deportiva Aucas       0.000000             1
Tecnico Universitario          0.000000             1
Universidad Catolica           2.111111  [3, 3, 2, 1]

为什么我得到一个列表而不是9?

1 个答案:

答案 0 :(得分:1)

您正在寻找'size'。对于常见功能,您应该将信任字符串映射到高效算法。例如:

d = {'media': 'mean', 'contador': 'size'}
res = homedata.groupby('local')['r1'].agg(d)

  

我希望在'contador'中有一列整数。

这不是您应该期望的。首先请注意,pd.Series.value_counts返回一个pd.Series个计数对象,而不是整数。目前尚不清楚您期望该方法返回什么整数。

某些值是整数而另一些值是列表的原因表明groupby正在执行某种转换:它假设如果value_counts返回一系列长度为1的数据,则您仅对该值的第一个值感兴趣系列。

为了说明,让我们看一下您所看到的 minimum 例子:

import pandas as pd

df = pd.DataFrame([['A', 1], ['B', 2], ['B', 2], ['C', 4],
                   ['B', 2], ['B', 6]], columns=['Group', 'Value'])

res = df.groupby('Group')['Value'].agg({'counts': lambda x: x.value_counts()})

print(res)

       counts
Group        
A           1
B      [3, 1]
C           1