我有一个包含3列的数据框。每列包含yes
,no
或nan
。
我试图根据列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
。例如,b
& no
是2/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%
如果需要更多信息,请与我们联系。
答案 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%