按组计算Python

时间:2019-06-03 19:00:36

标签: python pandas data-manipulation

我有一个数据:

print(dataset)
variable   groups    value  
    Both        I  3099060    
    Both        U   175820    
    C_only      I  5207055    
    C_only      U   225992    
    P_only      I  4063438    
    P_only      U   175593    
      None      I  9413116    
      None      U   292982    

dataset.value.dtype
dtype('int64')
type(dataset)
pandas.core.frame.DataFrame

我正在尝试创建一个名为value2的新变量,该变量的计算方法是将值除以每个组下的总值。
我想要的是:

variable   groups    value     value2
    Both        I  3099060    0.14227
    Both        U   175820    0.20200
    C_only      I  5207055    0.23905
    C_only      U   225992    0.25965
    P_only      I  4063438    0.18654
    P_only      U   175593    0.20174
      None      I  9413116    0.43214
      None      U   292982    0.33661

我使用groupby进行了计算,但得到了NaN

dataset['value2'] = dataset.groupby(['groups']).value / dataset.groupby(['groups']).value.sum()  

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用groupby + transform创建一个与values列相同形状的数组,这样您可以简单地将两者分开:

df['value2'] = df['value'] / df.groupby('groups')['value'].transform('sum')

我们可以使用div方法

df['value2'] = df['value'].div(df.groupby('groups')['value'].transform('sum'))

  variable groups    value    value2
0     Both      I  3099060  0.142272
1     Both      U   175820  0.202002
2   C_only      I  5207055  0.239046
3   C_only      U   225992  0.259645
4   P_only      I  4063438  0.186545
5   P_only      U   175593  0.201741
6     None      I  9413116  0.432138
7     None      U   292982  0.336611

速度比较

dfbig = pd.concat([df]*100000)
dfbig.shape

(800000, 4)

Erfan 1

%%timeit

dfbig['value2'] = dfbig['value'] / dfbig.groupby('groups')['value'].transform('sum')

109 ms ± 8.92 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Erfan 2

%%timeit

dfbig['value2'] = dfbig['value'].div(dfbig.groupby('groups')['value'].transform('sum'))

113 ms ± 2.96 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

iamchoosinganame

%%timeit

dfbig['value2']=dfbig.groupby('groups')['value'].transform(lambda x: x/x.sum())

412 ms ± 12.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

答案 1 :(得分:1)

使用groupby并使用lambda函数进行转换。

dataset['value2']=dataset.groupby('groups')['value'].transform(lambda x: x/x.sum())