首页 > 解决方案 > pandas 图形上不需要的级别和错误的计算

问题描述

我有以下数据集:

df = pd.DataFrame({'id':[1,2,3,4,5,6,7,8,9,10,11,12],
                   'city':['Pau','Pau','Pau','Pau','Pau','Pau','Lyon','Dax','Dax','Lyon','Lyon','Lyon'],
                   'type':['A','A','A','A','B','B','B','A','B','A','B','B'],
                   'val':[100,90,95,95,90,75,100,70,75,90,95,85]})
    id  city    type    val
0   1   Pau     A       100
1   2   Pau     A       90
2   3   Pau     A       95
3   4   Pau     A       95
4   5   Pau     B       90
5   6   Pau     B       75
6   7   Lyon    B       100
7   8   Dax     A       70
8   9   Dax     B       75
9   10  Lyon    A       90
10  11  Lyon    B       95
11  12  Lyon    B       85

我想创建一个按变量分组的图city,并获取每种类型的频率百分比。我试过这个:

df.groupby(['city','type']).agg({'type':'count'}).transform(lambda x: x/x.sum()).unstack().plot()

在此处输入图像描述

但是我每组得到错误的值和不需要的“无”。预期值应该是:

type    A   B
city        
Dax     .50 .50
Lyon    .33 .66
Pau     .66 .33

标签: pythonpandas

解决方案


查看您的要求,您可能需要使用标准化的交叉表:

pd.crosstab(df['city'],df['type'],normalize='index').plot()

在此处输入图像描述

在哪里:

print(pd.crosstab(df['city'],df['type'],normalize='index'))

type         A         B
city                    
Dax   0.500000  0.500000
Lyon  0.250000  0.750000
Pau   0.666667  0.333333

推荐阅读