我有一个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列是该行总数freq中的freq。例如,bno2/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%


请让我知道是否需要更多信息。

最佳答案

您走在正确的轨道上。 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%


为了漂亮地打印出来,我们要删除“唯一”列标题。然后将“否”部分和“是”部分放在一起。

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%

关于python - 修改描述功能以删除和添加列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35436905/

10-12 13:03