Pandas DF Groupby

时间:2021-04-02 07:43:09

标签: python pandas

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

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

2 个答案:

答案 0 :(得分:0)

对于单身学生,您可以:

df.groupby(['Strand-->', 'S1']).size().to_frame(name = 'size').reset_index()

如果您想一次计算所有学生,您可以这样做:

df_m = pd.melt(df, id_vars=['Strand-->'], value_vars=df.columns[1:]).rename({'variable':'result'},axis=1).sort_values(['result'])
df_m['result'].groupby([df_m['Strand-->'],df_m['value']]).value_counts().unstack(fill_value=0).reset_index()

答案 1 :(得分:0)

我认为您希望将 S1 到 S82 的每个学生的 Strands 分组。

这就是我要怎么做。

  • 第 1 步:使用 groupby Strand--> 创建一个 DataFrame,其中 value 为 0
  • 第 2 步:使用 groupby Strand--> where value 创建另一个 DataFrame 是 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

更新的数据帧: 请注意,列 'val' 将是 01。如果 0,则它是 0 的计数。如果 1,则它是 1 的计数。

              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
相关问题