2017-08-12 54 views
1

我有一个看起来像数据:如何组和索引大熊猫数据框获得所需的箱形图

Region = [random.choice([1,2,3,4,5]) for x in range(100)] 
Gender = [random.choice(['Male', 'Female']) for x in range(100)] 
Balance = [random.random()*1000 for x in range(100)] 
df = pd.DataFrame({'Region':Region, 'Gender':Gender, 'Balance':Balance}) 

我希望得到一个多索引的数据帧索引(地域,性别),使我可以拨打df.plot.box(vert=False)并获得像这样的东西(制作于R)。

Multi-indexed box plot

这似乎应该是简单,但我似乎无法得到正确的重塑/索引。

+0

如果你做'性别= [random.choice( '男', '女')在范围X(100)]'你必须做'性别= [random.choice(['Male','Female'])for x in range(100)]' –

回答

3
np.random.seed(23) 
Region = np.random.choice([1,2,3,4,5], size=100) 
Gender = np.random.choice(['Male', 'Female'], size=100) 
Balance = np.random.rand(100)*1000 
df = pd.DataFrame({'Region':Region, 'Gender':Gender, 'Balance':Balance}) 
print (df.head()) 
     Balance Gender Region 
0 384.491355 Female  4 
1 328.787350 Female  1 
2 529.003182 Male  2 
3 96.884964 Female  1 
4 23.379931 Male  5 

我觉得需要拼接RegionGender第一,使用cumcount用于计算每个组pivot

idx = df['Region'].astype(str) + '.' + df['Gender'] 
cols = idx.groupby(idx).cumcount() 
df1 = pd.pivot(index=cols, columns=idx, values=df['Balance']) 
print (df1) 

print (df1.head()) 

    1.Female  1.Male 2.Female  2.Male 3.Female  3.Male \ 
0 328.787350 298.232904 888.262152 529.003182 959.644810 962.342645 
1 96.884964 780.852785 738.040024 760.956146 119.652522 601.118950 
2 910.707827 611.333680 116.517822 155.214746 140.653479 688.654958 
3 50.119030 205.932674 148.848025 794.379306 380.307363 194.257663 
4 263.554386 605.087006 953.241083 113.8.912082 170.791317 

    4.Female  4.Male 5.Female  5.Male 
0 384.491355 122.347230 400.107360 23.379931 
1 190.038651 564.785449 330.269653 998.586681 
2 521.390446 757.714947 512.813561 185.192917 
3 566.314099 939.538858 480.686727 80.862220 
4 927.260017 175.496721 342.465179 287.932951 

df1.plot.box(vert=False) 

graph


旧的解决方案:

看来你需要通过groupby和汇总meanpivot_table重塑:

a = df.groupby(['Gender','Region'])['Balance'].mean().unstack() 
#alternatively 
#a = df.pivot_table(index='Gender', columns='Region', values='Balance', aggfunc='mean') 
print (a) 
Region   1   2   3   4   5 
Gender                
Female 357.970914 679.143664 442.473514 498.600391 618.475656 
Male 531.211030 462.071729 470.280364 623.540595 362.917609 

a.plot.box(vert=False) 


b = df.groupby(['Region','Gender'])['Balance'].mean().unstack() 
print (b) 
Gender  Female  Male 
Region       
1  357.970914 531.211030 
2  679.143664 462.071729 
3  442.473514 470.280364 
4  498.600391 623.540595 
5  618.475656 362.917609 

b.plot.box(vert=False) 
+0

好的工作,谢谢。你能解释一下吗?cols = idx.groupby(idx).cumcount()?一系列自己组成的枢轴索引看起来并不直观。这里的累积计数呼叫是做什么的? – verisimilidude

+0

嗯,我尝试创建没有新列的解决方案,所以与df ['idx'] = df ['Region']。astype(str)+'。'相同。 + df ['Gender'],然后df ['cols'] = df.groupby('idx')。cumcount()和last df1 = df.pivot(index ='cols',columns ='idx',values = 'Balance') print(df1)。如果需要cumcount和series,则使用idx.groupby(idx)。祝你好运! – jezrael