Python 在数据汇总中计算百分比

Python 在数据汇总中计算百分比,python,pandas,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']})
其中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]

这是计算百分比的最佳方法还是有比透视表更好的方法?

也许这不够一般,但您可以使用

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)

我觉得你的回答很好。它的可读性很强,这显然很重要

如果你想要一个替代方案,你可以看看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

哈哈!这是令人困惑的,因为问题第一部分中的数据框与第二部分中的数据框有不同的字母。S已经变成了E等。你能更新你的例子,使之匹配吗?是的,按位置分割会很好。