如何使用数据透视表或分组表来划分这些值

Posted

技术标签:

【中文标题】如何使用数据透视表或分组表来划分这些值【英文标题】:how to divide these values using pivot or groupby table 【发布时间】:2020-06-13 04:27:34 【问题描述】:

有一个从 1 到 100 的等级列表,分配给 1000 人进行多项考试

片段:

name     rank  
mark     1
stuart   2
lee      15
lenord   8
sheldon  99
cubbon   26
stuart   35
lee      40
lenord   66
mark     9
sheldon  1
cubbon   2
mark     100
mark     6

使用 pivot 和 groupby 如何根据计数来划分这样的东西

name        0-9   10-19 20-29  30-39 40-49 50-59 60-69 70-79 80-89 90-100

mark         3       0    0      0     0     0     0     0    0      1
stuart       1       0    0      1     0     0     0     0    0      0   
lee          0       1    0      0     1     0     0     0    0      0   
lenord       1       0    0      0     0     0     1     0    0      0  
sheldon      1       0    0      0     0     0     0     0    0      1 
cubbon       1       0    1      0     0     0     0     0    0      0  

尝试了 pivot 和 groupby ,但是如何自动而不是手动创建 0-10 ..... 90-100 列

试过这个:但是需要很长时间

rank_1_10=df[(df['rank'] >= 0) & (df['rank'] <= 10)]

rank_1_10=rank_1_10.groupby(['name']).agg('rank': 'count')

......

rank_100=df[(df['rank'] >= 90) & (df['rank'] <= 100)]

rank_10=rank_100.groupby(['name']).agg('rank': 'count')

那我把这些都合并了,有什么简单的方法

【问题讨论】:

@jezrael 尝试关注该帖子但无法弄清楚 那你试试? 发布数据有分箱值,但我的是将这些分成单独的列。刚开始学习 groupby , aggregation , pivot 。 ***.com/questions/51745831/…的可能重复 @Pygirl - 不,因为没有标签,没有重新索引。 【参考方案1】:

使用cut by np.arangezip 创建的标签,最后一个值不同,因此更正了在 bin 中添加 1 并在标签中减去 1

bins = np.arange(0, 110, 10)
#dynamically create labels
labels = ['-'.format(i, j-1) for i, j in zip(bins[:-1], bins[1:])] 
bins[-1] += 1
labels[-1] = '-'.format(bins[-2], bins[-1]-1)

df['binned'] = pd.cut(df['rank'], bins = bins, labels=labels, right=False)
print (df)
       name  rank  binned
0      mark     1     0-9
1    stuart     2     0-9
2       lee    15   10-19
3    lenord     8     0-9
4   sheldon    99  90-100
5    cubbon    26   20-29
6    stuart    35   30-39
7       lee    40   40-49
8    lenord    66   60-69
9      mark     9     0-9
10  sheldon     1     0-9
11   cubbon     2     0-9
12     mark   100  90-100
13     mark     6     0-9

然后对于计数使用crosstabDataFrame.reindex 来添加所有不存在的列:

df1 = pd.crosstab(df['name'], df['binned']).reindex(labels, axis=1, fill_value=0)
print (df1)
binned   0-9  10-19  20-29  30-39  40-49  50-59  60-69  70-79  80-89  90-100
name                                                                        
cubbon     1      0      1      0      0      0      0      0      0       0
lee        0      1      0      0      1      0      0      0      0       0
lenord     1      0      0      0      0      0      1      0      0       0
mark       3      0      0      0      0      0      0      0      0       1
sheldon    1      0      0      0      0      0      0      0      0       1
stuart     1      0      0      1      0      0      0      0      0       0

【讨论】:

以上是关于如何使用数据透视表或分组表来划分这些值的主要内容,如果未能解决你的问题,请参考以下文章

用于计算唯一值的简单数据透视表

过滤数据透视表列,仅在

如何使用 Pandas 中的数据透视表计算标准差?

Excel 数据透视表:在分组数据透视表中添加单列

如何使用数据透视表进行分组

使用 Excel 数据透视表作为另一个数据透视表的数据源