我有一个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%
请让我知道是否需要更多信息。
最佳答案
您走在正确的轨道上。 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/