2017-06-02 39 views
2

我有这样的数据帧:制作一个新的列,它是一个比

mob.columns 
Out[806]: Index([u'country', u'maxterm', u'quantity'], dtype='object') 

下面是一些数据:

mob.head(5) 
Out[807]: 
     country maxterm quantity 
0  China aled  44 
1  China fanx  77 
2  China grrx  12 
3  China hldo  13 
4  China jnmp  29 

什么是创建一个新的列,它是一个比最简单的方法每行所列数量为每个国家所有数量的总和?我正在尝试groupby和pivot并制作一个lambda函数。这种尝试

mob.groupby(['country', 'maxterm'])['quantity'].apply(lambda x: x/float(sum(x))) 

没有工作,它只是输出一堆1。如果我可以在原始数据框中创建一个新列,那将是最好的。

回答

4

使用transform

mob.quantity/mob.groupby('country').quantity.transform('sum') 

0 0.251429 
1 0.440000 
2 0.068571 
3 0.074286 
4 0.165714 
Name: quantity, dtype: float64 

与计算assign

mob.assign(ratio=mob.groupby('country').quantity.transform(lambda x: x/x.sum())) 

    country maxterm quantity  ratio 
0 China aled  44 0.251429 
1 China fanx  77 0.440000 
2 China grrx  12 0.068571 
3 China hldo  13 0.074286 
4 China jnmp  29 0.165714 

选择创建一个新列

%timeit mob.quantity.values/mob.groupby('country').quantity.transform('sum').values 
%timeit mob.groupby('country').quantity.transform(lambda x: x/x.sum()) 
%timeit mob.quantity/mob.groupby('country').quantity.transform('sum') 

1000 loops, best of 3: 956 µs per loop 
1000 loops, best of 3: 1.53 ms per loop 
1000 loops, best of 3: 1.03 ms per loop 
+1

我真的很挣扎不知道分配:) –

相关问题