首页 > 解决方案 > Pandas DF Groupby

问题描述

我有一个学生响应的数据框 [S1-S82] 以及对应于响应的每个链。我想知道每条链给出的每个响应的计数。如果学生正确标记答案,我想知道链名称和否。正确答案,如果答案是错误的,我想知道链名和不。错误响应(类似于值计数)。我附上了数据框的屏幕截图。 https://prnt.sc/1125odu

我已经编写了以下代码 data_transposed['Counts'] = data_transposed.groupby(['STRAND-->'])['S1'].transform('count') ,但它真的没有帮助我得到我想要的。我正在寻找类似于 value_counts 的选项来绘制数据。请调查一下并帮助我。谢谢,

标签: pythonpandas

解决方案


我认为您正在为 S1 到 S82 的每个学生按 Strands 分组。

这就是我将如何做到的。

  • 第 1 步:使用 groupby 创建一个 DataFrame,Strand-->其中值为 0
  • 第 2 步:使用 groupby 创建另一个 DataFrame,Strand-->其中值为 1
  • 第 3 步:在每个数据框中添加一列,并指定 0 或 1 的值来表示它分组的数据
  • 第 4 步:连接两个数据帧。
  • 第 5 步:将列重新排列为Strand-->, , 然后是所有val学生S1S82
  • 第 6 步:使用排序数据框,Strand-->以便您以正确的顺序获取值。

代码如下所示:

import pandas as pd
import numpy as np

d = {'Strand-->':['Geometry','Geometry','Geometry','Geometry','Mensuration',
                                'Mensuration','Mensuration','Geometry','Algebra','Algebra',
                                'Comparing Quantities','Geometry','Data Handling','Geometry','Geometry']}
for i in range(1,83): d ['S'+str(i)] = np.random.randint(0,2,size=15) 
df = pd.DataFrame(d)
print (df)

df1 = df.groupby('Strand-->').agg(lambda x: x.eq(0).sum())
df1['val'] = 0
df2 = df.groupby('Strand-->').agg(lambda x: x.ne(0).sum())
df2['val'] = 1
df3 = pd.concat([df1,df2]).reset_index()
dx = [0,-1] + [i for i in range(1,83)]
df3 = df3[df3.columns[dx]].sort_values('Strand-->').reset_index(drop=True)
print (df3)

其输出如下:

原始数据框:

               Strand-->  S1  S2  S3  S4  S5  ...  S77  S78  S79  S80  S81  S82
0               Geometry   0   1   0   0   1  ...    1    0    0    0    1    0
1               Geometry   0   0   0   1   1  ...    1    1    1    0    0    0
2               Geometry   1   1   1   0   0  ...    0    0    1    0    0    0
3               Geometry   0   1   1   0   1  ...    1    0    0    1    0    1
4            Mensuration   1   1   1   0   1  ...    0    1    1    1    0    0
5            Mensuration   0   1   1   1   0  ...    1    0    0    1    1    0
6            Mensuration   1   0   1   1   1  ...    0    1    0    0    1    0
7               Geometry   1   0   1   1   1  ...    1    1    1    0    0    1
8                Algebra   0   0   1   0   1  ...    1    1    0    0    1    1
9                Algebra   0   1   0   1   1  ...    1    1    1    1    0    1
10  Comparing Quantities   1   1   0   1   1  ...    1    1    0    1    1    0
11              Geometry   1   1   1   1   0  ...    0    0    1    0    1    0
12         Data Handling   1   1   0   0   0  ...    1    0    1    1    0    0
13              Geometry   1   1   1   0   0  ...    1    1    1    1    0    0
14              Geometry   0   1   0   0   1  ...    0    1    1    0    1    0

更新的 DataFrame:请注意,此处的列'val'将是01。如果0,那么它是0s 的计数。如果1,那么它是1s 的计数。

              Strand-->  val  S1  S2  S3  S4  ...  S77  S78  S79  S80  S81  S82
0               Algebra    0   2   1   1   1  ...    0    0    1    1    1    0
1               Algebra    1   0   1   1   1  ...    2    2    1    1    1    2
2  Comparing Quantities    0   0   0   1   0  ...    0    0    1    0    0    1
3  Comparing Quantities    1   1   1   0   1  ...    1    1    0    1    1    0
4         Data Handling    0   0   0   1   1  ...    0    1    0    0    1    1
5         Data Handling    1   1   1   0   0  ...    1    0    1    1    0    0
6              Geometry    0   4   2   3   5  ...    3    4    2    6    5    6
7              Geometry    1   4   6   5   3  ...    5    4    6    2    3    2
8           Mensuration    0   1   1   0   1  ...    2    1    2    1    1    3
9           Mensuration    1   2   2   3   2  ...    1    2    1    2    2    0

推荐阅读