pandas 分组问题

这个 pandas 分组 怎么写?
有两个表,一个成绩表,一个满分表 如下图

img

img



需要1. 根据区县进行分组 统计,总人数,均值,满分人数,满分率,零分人数,零分率,不满分(>0分,<满分)人数,不满分率
2.根据区县和 学校进行分组 统计,

结果表要如下:

img

【以下回答由 GPT 生成】

首先,我们需要导入 pandas 并读取成绩表和满分表的数据。假设成绩表的文件名为 "成绩表.csv",满分表的文件名为 "满分表.csv"。

import pandas as pd

# 读取成绩表和满分表的数据
成绩表 = pd.read_csv("成绩表.csv")
满分表 = pd.read_csv("满分表.csv")

接下来,我们可以根据区县进行分组,并进行相应的统计。

问题1:根据区县进行分组,统计每个区县的总人数、均值、满分人数、满分率、零分人数和零分率,以及不满分的人数和不满分率。

# 根据区县进行分组
按区县分组 = 成绩表.groupby("区县")

# 统计总人数
总人数 = 按区县分组.size()

# 统计均值
均值 = 按区县分组["成绩"].mean()

# 统计满分人数
满分人数 = 按区县分组.apply(lambda x: (x["成绩"] == 满分表.loc[满分表["区县"] == x.name, "满分"].values[0]).sum())

# 统计满分率
满分率 = 满分人数 / 总人数

# 统计零分人数
零分人数 = 按区县分组.apply(lambda x: (x["成绩"] == 0).sum())

# 统计零分率
零分率 = 零分人数 / 总人数

# 统计不满分人数
不满分人数 = 总人数 - 满分人数 - 零分人数

# 统计不满分率
不满分率 = 不满分人数 / 总人数

# 将结果组合成一个新的 DataFrame
结果1 = pd.DataFrame({"总人数": 总人数, "均值": 均值, "满分人数": 满分人数, "满分率": 满分率, "零分人数": 零分人数, "零分率": 零分率, "不满分人数": 不满分人数, "不满分率": 不满分率})

问题2:根据区县和学校进行分组,统计每个区县每个学校的总人数、均值、满分人数、满分率、零分人数和零分率,以及不满分的人数和不满分率。

# 根据区县和学校进行分组
按区县学校分组 = 成绩表.groupby(["区县", "学校"])

# 统计总人数
总人数 = 按区县学校分组.size()

# 统计均值
均值 = 按区县学校分组["成绩"].mean()

# 统计满分人数
满分人数 = 按区县学校分组.apply(lambda x: (x["成绩"] == 满分表.loc[满分表["区县"] == x.name[0], "满分"].values[0]).sum())

# 统计满分率
满分率 = 满分人数 / 总人数

# 统计零分人数
零分人数 = 按区县学校分组.apply(lambda x: (x["成绩"] == 0).sum())

# 统计零分率
零分率 = 零分人数 / 总人数

# 统计不满分人数
不满分人数 = 总人数 - 满分人数 - 零分人数

# 统计不满分率
不满分率 = 不满分人数 / 总人数

# 将结果组合成一个新的 DataFrame
结果2 = pd.DataFrame({"总人数": 总人数, "均值": 均值, "满分人数": 满分人数, "满分率": 满分率, "零分人数": 零分人数, "零分率": 零分率, "不满分人数": 不满分人数, "不满分率": 不满分率})

最后,我们可以将结果打印出来,或者保存为一个新的文件。

# 打印结果
print("问题1的结果:")
print(结果1)
print("问题2的结果:")
print(结果2)

# 保存为一个新的文件
结果1.to_csv("问题1的结果.csv")
结果2.to_csv("问题2的结果.csv")

以上就是使用 pandas 对该问题进行分组和统计的完整解决方案。如果有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

Emm这个查一下pandas文档可以按照你要的来

不是自带函数吗,可以看文档

Pandas-分组:df.groupby()
类似这种

img

你要如何分组?请说明清楚,好为您解答,另外能附上数据文件是最好。

pandas基础--分组
可以参考下,很简单得

在分组之前应该需要先统计出每位考生的总成绩吧,然后在根据区县学校等进行分组。建议提供下具体的数据文档。

应用gpt作答:
在使用 pandas 对成绩表和满分表进行分组统计时,你可以按照以下步骤进行操作:

  1. 导入 pandas 库并读取成绩表和满分表的数据:
    ```python
    import pandas as pd

读取成绩表和满分表数据

df_scores = pd.read_csv('scores.csv')
df_full_marks = pd.read_csv('full_marks.csv')


2. 将成绩表和满分表进行合并,以便进行统计:
```python
# 合并成绩表和满分表
df_merged = pd.merge(df_scores, df_full_marks, on='科目')
  1. 根据区县进行分组统计:

    # 分组统计
    df_group_by_district = df_merged.groupby('区县').agg(
     总人数=('学号', 'count'),
     均值=('成绩', 'mean'),
     满分人数=('成绩', lambda x: (x == 100).sum()),
     满分率=('成绩', lambda x: (x == 100).mean()),
     零分人数=('成绩', lambda x: (x == 0).sum()),
     零分率=('成绩', lambda x: (x == 0).mean()),
     不满分人数=('成绩', lambda x: ((x > 0) & (x < 100)).sum()),
     不满分率=('成绩', lambda x: ((x > 0) & (x < 100)).mean())
    ).reset_index()
    
  2. 根据区县和学校进行分组统计:

    # 分组统计
    df_group_by_district_school = df_merged.groupby(['区县', '学校']).agg(
     总人数=('学号', 'count'),
     均值=('成绩', 'mean'),
     满分人数=('成绩', lambda x: (x == 100).sum()),
     满分率=('成绩', lambda x: (x == 100).mean()),
     零分人数=('成绩', lambda x: (x == 0).sum()),
     零分率=('成绩', lambda x: (x == 0).mean()),
     不满分人数=('成绩', lambda x: ((x > 0) & (x < 100)).sum()),
     不满分率=('成绩', lambda x: ((x > 0) & (x < 100)).mean())
    ).reset_index()
    

以上代码将根据区县和学校分组统计所需的指标,并将结果保存在两个 pandas DataFrame 对象中:df_group_by_districtdf_group_by_district_school。你可以根据需要进一步处理和输出这些结果表格。

先单独计算出各个列的值,然后再统一写进一张表中,

# 创建包含统计结果的 DataFrame
results_df = pd.DataFrame({
    '总人数': total_count,
    '均值': mean_score,
    '满分人数': perfect_count,
    '满分率': perfect_rate,
    '零分人数': zero_count,
    '零分率': zero_rate,
    '不满分人数': not_perfect_count,
    '不满分率': not_perfect_rate
})

# 打印结果表
print(results_df)