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
我觉得需要拼接Region
和Gender
第一,使用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)
旧的解决方案:
看来你需要通过groupby
和汇总mean
或pivot_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)
如果你做'性别= [random.choice( '男', '女')在范围X(100)]'你必须做'性别= [random.choice(['Male','Female'])for x in range(100)]' –