You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的DataFrame中按日期计算校际成绩比值并追加数据

解决方案:无需循环,用Pandas透视表高效实现

嘿,这个需求完全不用写循环!Pandas的分组和透视表工具就能轻松搞定,而且效率比循环高多了,尤其是数据量大的时候。我给你一步步拆解解决方案,附代码示例:

1. 先明确需求逻辑

我们需要按相同日期+相同班级(因为你的DataFrame有Class列,默认Grade是班级层面的),计算School A和School B的Grade比值,然后把这些比值作为新行(School列标记为School A/School B)追加到原DataFrame中。

2. 示例数据与代码实现

先假设你的初始DataFrame长这样(你可以替换成自己的数据):

import pandas as pd

# 模拟你的原始数据
data = {
    'Date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02'],
    'School': ['School A', 'School B', 'School A', 'School B'],
    'Grade': [85, 90, 78, 80],
    'Class': ['Class 1', 'Class 1', 'Class 2', 'Class 2']
}
df = pd.DataFrame(data)

接下来执行核心操作:

# 1. 构建透视表:按Date+Class分组,把School A/B的Grade转为列
pivot_df = df.pivot_table(
    index=['Date', 'Class'],
    columns='School',
    values='Grade',
    aggfunc='first'  # 假设每个(Date,Class,School)只有一条记录,若有多条可换mean/sum等
).reset_index()

# 2. 过滤掉缺少A或B的组(避免除法报错)
pivot_df = pivot_df.dropna(subset=['School A', 'School B'])

# 3. 计算A/B的Grade比值
pivot_df['Ratio'] = pivot_df['School A'] / pivot_df['School B']

# 4. 把比值转换成原DataFrame的行结构
ratio_rows = pivot_df[['Date', 'Class', 'Ratio']].rename(columns={'Ratio': 'Grade'})
ratio_rows['School'] = 'School A/School B'

# 5. 合并原数据和新生成的比值行
final_df = pd.concat([df, ratio_rows], ignore_index=True)

3. 最终结果示例

执行完后,final_df会变成这样:

DateSchoolGradeClass
2024-01-01School A85.0Class 1
2024-01-01School B90.0Class 1
2024-01-02School A78.0Class 2
2024-01-02School B80.0Class 2
2024-01-01School A/School B~0.94Class 1
2024-01-02School A/School B0.975Class 2

4. 灵活调整说明

  • 如果你的Grade是学校整体的(不需要按Class分组),只需要把透视表的index改成['Date']即可。
  • 如果同一个(Date,Class,School)有多个Grade记录,把aggfunc改成'mean'(取平均值)、'sum'(求和)等,根据你的业务需求调整。
  • 如果你想保留缺失比值的行(比如某个日期只有A没有B),可以去掉dropna那一步,比值会显示为NaN。

内容的提问来源于stack exchange,提问作者JonDoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:22:50