jupyter notebook先取出成绩,修改数据类型为int,对成绩排序argsort,最后对stu做索引
时间: 2024-09-19 16:12:57 浏览: 49
在Jupyter Notebook中,如果你有一个包含成绩的数据列,首先你可以按照以下步骤操作:
1. **取出成绩**:假设你的成绩数据存储在一个名为`scores`的列中,可以使用`df['scores']`来获取这一列。
2. **修改数据类型为int**:由于成绩通常表示数字,如果原始数据是字符串或其他非数值类型,需要将其转换为整数(int)。在Pandas中,你可以使用`pd.to_numeric()`函数,并指定`errors='coerce'`来将无法转换的值设为NaN。示例代码如下:
```python
scores_int = pd.to_numeric(df['scores'], errors='coerce').astype(int)
```
3. **对成绩排序并创建索引**:使用`argsort()`函数可以按升序排列成绩,然后返回对应的行索引。这个函数不会改变原 DataFrame 的顺序,它会返回一个整数数组。例如:
```python
sorted_indices = scores_int.argsort()
df_sorted = df.iloc[sorted_indices]
```
这样,`df_sorted`就是按照成绩从低到高排序后的DataFrame。
相关问题
def sort(): # 成绩排序 show() # 显示学生信息列表 if os.path.exists(filename): with open(filename, 'r', encoding = 'UTF-8') as r_file: stu_list = r_file.readlines() stu_new = [] for i in stu_list: d = dict(eval(i)) stu_new.append(d) else: return asc_or_desc = input('请选择(0.升序 1.降序):') if asc_or_desc == '0': asc_or_desc_bool = False # 升序标记 elif asc_or_desc == '1': asc_or_desc_bool = True # 降序标记 else: print('输入错误!') m = input('请选择排序方式:(1.按英语成绩排序 2.按python成绩排序 3.按数学成绩排序 4.按数据结构成绩排序 0.按总成绩排序):') if m == '1': # 按英语成绩排序 stu_new.sort(key = lambda x:int(x['english']), reverse = asc_or_desc_bool) elif m == '2': # 按python成绩排序 stu_new.sort(key = lambda x:int(x['python']), reverse = asc_or_desc_bool) elif m == '3': # 按数学成绩排序 stu_new.sort(key = lambda x:int(x['math']), reverse = asc_or_desc_bool) elif m == '4': # 按数据结构成绩排序 stu_new.sort(key = lambda x:int(x['data']), reverse = asc_or_desc_bool) elif m == '0': # 按总成绩排序 stu_new.sort(key = lambda x:int(x['english']) + int(x['python']) + int(x['math']) + int(x['data']), reverse = asc_or_desc_bool) else: print("输入有误!") show_stu(stu_new)写出上面这段代码的伪代码
定义一个函数sort,没有输入参数
调用show函数,展示学生信息列表
如果文件存在,则打开文件
将文件内容按行读入到列表stu_list中
定义一个空列表stu_new
遍历stu_list中的每个元素i,使用eval函数将其转换为字典类型d
将d添加到stu_new列表中
否则返回
获取排序方式,升序或降序
如果输入不合法,则提示错误
获取排序方式,按照英语成绩、Python成绩、数学成绩、数据结构成绩或总成绩排序
如果输入不合法,则提示错误
根据所选的排序方式,对stu_new列表进行排序,使用lambda表达式指定排序方式和排序顺序
调用show_stu函数,展示排序后的stu_new列表
定义一个 student 结构体如下: struct student { char name[20]; /*姓名*/ float score[4]; /*四门功课的成绩*/ float average; /*四门功课的平均成绩*/ }; 其中,name 中存放同学的姓名;score[4]数组中存放同学的英语、数学、物理、化学成绩;average中存放上述四门功课的平均成绩。 2) 编写下面5个函数。函数的具体要求: void inputFromKeyboard(struct student stu[], int num) 从键盘输入学生信息的函数。stu 为结构体数组,num 为数组中元素的个数。 void outputToScreen(struct student stu[], int num) 将学生信息输出到屏幕的函数。stu 为结构体数组,num 为数组中元素的个数。 void averageScore(struct student stu[], int num) 计算学生平均成绩的函数。stu 为结构体数组,num 为数组中元素的个数。 int compare(struct student stu1, struct student stu2) 对两个学生的平均成绩进行比较。若学生1的平均成绩高于学生2,返回值为1,否则返回值为0。stu1 和stu2为两个结构体变量,分别代表学生1和学生2。 void sortByAverageScore(struct student stu[], int num) 根据学生的平均成绩对学生信息整体排序的函数,其中两学生成绩比较要求调用函数compare。stu 为结构体数组,num 为数组中元素的个数。
1. 输入学生信息的函数 inputFromKeyboard:
```
void inputFromKeyboard(struct student stu[], int num) {
for (int i = 0; i < num; i++) {
printf("请输入第%d个学生的姓名:", i+1);
scanf("%s", stu[i].name);
printf("请输入第%d个学生的英语、数学、物理、化学成绩:", i+1);
for (int j = 0; j < 4; j++) {
scanf("%f", &stu[i].score[j]);
}
}
}
```
2. 输出学生信息的函数 outputToScreen:
```
void outputToScreen(struct student stu[], int num) {
printf("姓名\t英语\t数学\t物理\t化学\t平均成绩\n");
for (int i = 0; i < num; i++) {
printf("%s\t", stu[i].name);
for (int j = 0; j < 4; j++) {
printf("%.2f\t", stu[i].score[j]);
}
printf("%.2f\n", stu[i].average);
}
}
```
3. 计算学生平均成绩的函数 averageScore:
```
void averageScore(struct student stu[], int num) {
for (int i = 0; i < num; i++) {
float sum = 0;
for (int j = 0; j < 4; j++) {
sum += stu[i].score[j];
}
stu[i].average = sum / 4;
}
}
```
4. 对两个学生的平均成绩进行比较的函数 compare:
```
int compare(struct student stu1, struct student stu2) {
if (stu1.average > stu2.average) {
return 1;
} else {
return 0;
}
}
```
5. 根据学生的平均成绩对学生信息整体排序的函数 sortByAverageScore:
```
void sortByAverageScore(struct student stu[], int num) {
for (int i = 0; i < num - 1; i++) {
for (int j = 0; j < num - i - 1; j++) {
if (compare(stu[j], stu[j+1])) {
struct student temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
}
```
阅读全文
相关推荐

















