如何在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会变成这样:
| Date | School | Grade | Class |
|---|---|---|---|
| 2024-01-01 | School A | 85.0 | Class 1 |
| 2024-01-01 | School B | 90.0 | Class 1 |
| 2024-01-02 | School A | 78.0 | Class 2 |
| 2024-01-02 | School B | 80.0 | Class 2 |
| 2024-01-01 | School A/School B | ~0.94 | Class 1 |
| 2024-01-02 | School A/School B | 0.975 | Class 2 |
4. 灵活调整说明
- 如果你的Grade是学校整体的(不需要按Class分组),只需要把透视表的
index改成['Date']即可。 - 如果同一个(Date,Class,School)有多个Grade记录,把
aggfunc改成'mean'(取平均值)、'sum'(求和)等,根据你的业务需求调整。 - 如果你想保留缺失比值的行(比如某个日期只有A没有B),可以去掉
dropna那一步,比值会显示为NaN。
内容的提问来源于stack exchange,提问作者JonDoe
相关产品推荐
相关产品推荐

