我有一个包含几个分类变量的Pandas DataFrame。例如:
import pandas as pd
d = {'grade':['A','B','C','A','B'],
'year':['2013','2013','2013','2012','2012']}
df = pd.DataFrame(d)
我想将其转换为具有以下属性的MultiIndex DataFrame:
例如:
有人可以建议一种创建此MultiIndex DataFrame的方法吗?
答案 0 :(得分:3)
另一种方法可以使用melt
和groupby
:
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=
为此新索引指定名称。答案 3 :(得分:0)
可以通过在循环中堆叠每个变量来创建DataFrame,但这似乎效率低下。 e.g:
ojCollapsible
我希望有人能提出更好的方法,避免循环。