熊猫在数据汇总中计算百分比

时间:2014-02-12 10:59:37

标签: python pandas

假设我有数据框

df=pd.DataFrame({'Location': [ 'Ala', 'SS', 'Ala', 'Ala', 'SS', 'Ala', 'SS', 'TXE', 'TXE', 'TXE'],
                 'Bid': ['E','N','E','N','N','E', 'E',np.nan,np.nan,'A']})

如果S是密封投标,N是没有投标的人,Nan不存在,O是公开投标。

我想计算出公式为(E + A)/(E + A + N)的投标人百分比。做透视表然后实现等式的最佳方法是什么?

df=pd.DataFrame({'Location': [ 'Ala', 'SS', 'Ala', 'Ala', 'SS', 'Ala', 'SS', 'TXE', 'TXE', 'TXE'],
                 'Bid': ['E','N','E','N','N','E', 'E',np.nan,np.nan,'A']})


pt = df.pivot_table(rows='Location', cols='Bid', aggfunc='size', fill_value=0)

pt['Percentage']=(pt.A + pt.E)/(pt.A+pt.E+pt.N)
print (pt)

>>> 
Bid       A  E  N  Percentage
Location                     
Ala       0  3  1    0.750000
SS        0  1  2    0.333333
TXE       1  0  0    1.000000

[3 rows x 4 columns]

这是计算百分比的最佳方式还是比枢轴表有更好的方法?

2 个答案:

答案 0 :(得分:8)

也许这不够通用,但你可以用

获得百分比
counts = df3['Bid'].value_counts(normalize=True)

然后,将(E+A)作为所有出价的百分比,就像

一样简单
counts.E + counts.A

如果您不想在百分比计算中包含NaN出价

counts = df3['Bid'].dropna().value_counts(normalize=True)

并且,如果还有其他出价类型,则需要排除

all_allowable = df3['Bid'].isin(['E', 'A', 'N'])
counts = df3[all_allowable]['Bid'].value_counts(normalize=True)

按位置拆分

all_allowable = df3['Bid'].isin(['E', 'A', 'N'])    
df3[all_allowable].groupby('Location')['Bid'].value_counts(normalize=True)

答案 1 :(得分:0)

你的回答对我来说非常好。它非常易读,显然很重要。

如果您想要替代方案,可以查看groupby,但正如我所说,我认为您自己的答案看起来很棒:

>>> df=pd.DataFrame({'Location': [ 'Ala', 'SS', 'Ala', 'Ala', 'SS', 'Ala', 'SS', 'TXE', 'TXE', 'TXE'],
...                  'Bid': ['E','N','E','N','N','E', 'E',np.nan,np.nan,'A']})
>>> df = df.set_index('Location')
>>> ean = df.groupby(level='Location').count()
>>> ea = df[df != 'N'].groupby(level='Location').count()
>>> ea.astype(float) / ean
               Bid
Location          
Ala       0.750000
SS        0.333333
TXE       1.000000