python - Pandas DF Groupby
问题描述
我有一个学生响应的数据框 [S1-S82] 以及对应于响应的每个链。我想知道每条链给出的每个响应的计数。如果学生正确标记答案,我想知道链名称和否。正确答案,如果答案是错误的,我想知道链名和不。错误响应(类似于值计数)。我附上了数据框的屏幕截图。 https://prnt.sc/1125odu
我已经编写了以下代码
data_transposed['Counts'] = data_transposed.groupby(['STRAND-->'])['S1'].transform('count')
,但它真的没有帮助我得到我想要的。我正在寻找类似于 value_counts 的选项来绘制数据。请调查一下并帮助我。谢谢,
解决方案
我认为您正在为 S1 到 S82 的每个学生按 Strands 分组。
这就是我将如何做到的。
- 第 1 步:使用 groupby 创建一个 DataFrame,
Strand-->
其中值为 0 - 第 2 步:使用 groupby 创建另一个 DataFrame,
Strand-->
其中值为 1 - 第 3 步:在每个数据框中添加一列,并指定 0 或 1 的值来表示它分组的数据
- 第 4 步:连接两个数据帧。
- 第 5 步:将列重新排列为
Strand-->
, , 然后是所有val
学生S1
S82
- 第 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'
将是0
或1
。如果0
,那么它是0
s 的计数。如果1
,那么它是1
s 的计数。
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
推荐阅读
- c++ - 为什么编译器会跳过我的 while 语句?
- google-bigquery - 具有角色/查看者原始角色的服务帐户无法读取项目中的数据集
- reactjs - 任何 VIM 插件都可以帮助我重构 React 组件吗?
- php - Woocommerce - 在 wordpress 主页上显示打折产品 - wp_query
- php - PHP:制作for和foreach的多个循环
- javascript - 我们可以在运行时以角度编译和运行打字稿吗?
- java - 如何将数据更改通知到 Fragment 类?
- c - K&R 的 C 编程语言练习 2-2:重写 for 循环避免 && 或 ||
- angular - how can I apply the select directive to the first option generated by a *ngFor?
- ios - 将 SwiftUI 视图渲染为 UIImage