修改描述功能以删除和添加列

时间:2016-02-16 15:46:13

标签: python pandas

我有一个包含3列的数据框。每列包含yesnonan。 我试图根据列a找到每列的频率。我能够使用describe()执行此操作。

import pandas as pd, numpy as np

df2 = pd.DataFrame({'a':['yes','yes','no','yes','no','yes'],
                        'b':['no','yes','no','yes','no','no'],
                        'c':['yes','yes','yes','no','no', np.nan]})

df2.groupby('a').describe().transpose()

a    no                   yes                 
  count unique top freq count unique  top freq
b     2      1  no    2     4      2   no    2
c     2      2  no    1     3      2  yes    2

我无法选择我想要的describe列。下面是我希望它看起来的一个例子。 freq/total_count列是该行的freqfreq。例如,b& no2/6

a    no                                      yes                
  count top freq freq/total_count   count top freq freq/total_count
b     2  no    2     33%             4    no    2     33% 
c     2  no    1     20%             3   yes    2     40%

如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。 df2.groupby('a').describe().transpose()命令为DataFrame提供了MultiIndex。要选择/操作DataFrame的各个部分,您必须先选择“是”或“否”索引,然后选择列索引。

import pandas as pd, numpy as np

df2 = pd.DataFrame({'a':['yes','yes','no','yes','no','yes'],
                    'b':['no','yes','no','yes','no','no'],
                    'c':['yes','yes','yes','no','no', np.nan]})

data = df2.groupby('a').describe().transpose()

data['no','freq/total_count']=np.nan
data['yes','freq/total_count']=np.nan

for ind in data.index:
    data['no','freq/total_count'][ind] = data['no']['freq'][ind]/(data['no']['count'][ind]+data['yes']['count'][ind])*100
    data['yes','freq/total_count'][ind] = data['yes']['freq'][ind]/(data['no']['count'][ind]+data['yes']['count'][ind])*100


data['no','freq/total_count'] = data['no','freq/total_count'].map('{0:.0f}%'.format)
data['yes','freq/total_count'] = data['yes','freq/total_count'].map('{0:.0f}%'.format)

输出

a   no                          yes                           no                 yes
    count  unique  top   freq   count   unique   top   freq   freq/total_count   freq/total_count
b   2      1       no    2      4       2        no    2      33%                33%
c   2      2       no    1      3       2        yes   2      20%                40%

要打印出来,我们要删除“唯一”列标题。然后将'no'部分放在一起,将'yes'部分放在一起。

del data['no','unique']
del data['yes','unique']
pd.concat([data['no'],data['yes']],axis=1,keys=['no','yes'])

给出最终结果:

a   no                                     yes
    count  top   freq   freq/total_count   count   top   freq   freq/total_count
b   2      no    2      33%                4       no    2      33%
c   2      no    1      20%                3       yes   2      40%