将分类变量的Pandas DataFrame转换为具有计数和比例的MultiIndex

时间:2017-12-28 21:32:52

标签: python pandas dataframe categorical-data

我有一个包含几个分类变量的Pandas DataFrame。例如:

import pandas as pd

d = {'grade':['A','B','C','A','B'], 
    'year':['2013','2013','2013','2012','2012']}

df = pd.DataFrame(d)

enter image description here

我想将其转换为具有以下属性的MultiIndex DataFrame:

  • 第一级索引是变量名称(例如' grade')
  • 第二级索引是变量中的级别(例如' A'' B'' C')
  • 一栏包含' n',等级显示的次数
  • 第二列包含'比例',该比例代表的比例。

例如:

enter image description here

有人可以建议一种创建此MultiIndex DataFrame的方法吗?

4 个答案:

答案 0 :(得分:3)

另一种方法可以使用meltgroupby

df_out = df.melt().groupby(['variable','value']).size().to_frame(name='n')
df_out['proportion'] = df_out['n'].div(df_out.n.sum(level=0),level=0)
print(df_out)

输出:

                n  proportion
variable value               
grade    A      2         0.4
         B      2         0.4
         C      1         0.2
year     2012   2         0.4
         2013   3         0.6

而且,如果你真的想变得疯狂并且在单行中做到这一点:

(df.melt().groupby(['variable','value']).size().to_frame(name='n')
  .pipe(lambda x: x.assign(proportion = x[['n']]/x.groupby(level=0).transform('sum'))))

使用@Wen pct计算升级解决方案:

(df.melt().groupby(['variable','value']).size().to_frame(name='n')
  .pipe(lambda x: x.assign(proportion = x['n'].div(x.n.sum(level=0),level=0))))

答案 1 :(得分:3)

你可以试试这个..

If Now.ToString("hh:mm:ss tt") >= "06:00:00 AM" and Now.ToString <= "11:00:00 AM" Then
     'Do something
End If

答案 2 :(得分:1)

Stey by step method:

df1 = df.groupby("grade").count()
df2 = df.groupby("year").count() 

df1.columns = ['n']
df2.columns = ['n']
df1['proportion'] = df1.divide(df1.sum())
df2['proportion'] = df2.divide(df2.sum())

df_new = pd.concat([df1, df2], keys=['grade', 'year'], names=['variable'])
  • 在使用concat时,可以指定将成为最外层索引的keys。同时使用names=为此新索引指定名称。

enter image description here

答案 3 :(得分:0)

可以通过在循环中堆叠每个变量来创建DataFrame,但这似乎效率低下。 e.g:

ojCollapsible

我希望有人能提出更好的方法,避免循环。