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

基于多分组条件在Python中创建新列的实现方案

问题:计算Bond变量(Pool Collateral利率与Single Collateral利率的比值)

现有如下DataFrame,需创建名为Bond的新变量,按国家和年份将Pool类型Collateral对应的Rate除以Single类型Collateral对应的Rate。例如第0行的Rate(DE-2016-Pool)除以第4行的Rate(DE-2016-Single)、第8行的Rate(GB-2017-Pool)除以第7行的Rate(GB-2017-Single);若某国家某年份同时缺失Pool和Single Collateral的观测值,则填充缺失值。

原始数据代码

import pandas as pd

df = {
    'Date': [2016, 2016, 2016, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017, 2017, 2017],
    'Country': ['DE', 'AT','GB', 'FR', 'DE', 'FR', 'AT', 'GB', 'GB', 'DE', 'AT', 'FR' , 'AT'],
    'Collateral': ['Pool', 'Pool', 'Single', 'Single', 'Single', 'Pool', 'Single', 'Single', 'Pool', 'Pool', 'Pool', 'Pool', 'Single'],
    'Rate': [0.2, 0.3, 0.1, 0.4, 0.6, 0.002, 0.005, 0.2, 0.9, 0.5, 0.67, 0.08, 0.4]
}

df = pd.DataFrame(df)

解决方案

通过pivot_table将同国家同年份的Pool、Single数据整理到同一行,计算比值后合并回原DataFrame即可:

# 1. 按年份、国家分组,将Collateral类型转为列,提取对应Rate
pivot_df = df.pivot_table(
    index=['Date', 'Country'],
    columns='Collateral',
    values='Rate',
    aggfunc='first'  # 假设每个(Date, Country, Collateral)组合唯一,有重复可替换为mean等
).reset_index()

# 2. 计算Bond值:Pool / Single,缺失值自动保留NaN
pivot_df['Bond'] = pivot_df['Pool'] / pivot_df['Single']

# 3. 将Bond值合并回原DataFrame
result_df = df.merge(pivot_df[['Date', 'Country', 'Bond']], on=['Date', 'Country'], how='left')

# 查看结果
print(result_df)

运行结果

Date Country Collateral   Rate      Bond
0   2016      DE       Pool  0.200  0.333333
1   2016      AT       Pool  0.300  60.000000
2   2016      GB     Single  0.100       NaN
3   2016      FR     Single  0.400   0.005000
4   2016      DE     Single  0.600  0.333333
5   2016      FR       Pool  0.002   0.005000
6   2016      AT     Single  0.005  60.000000
7   2017      GB     Single  0.200   4.500000
8   2017      GB       Pool  0.900   4.500000
9   2017      DE       Pool  0.500       NaN
10  2017      AT       Pool  0.670   1.675000
11  2017      FR       Pool  0.080       NaN
12  2017      AT     Single  0.400   1.675000

说明

  • aggfunc='first'用于处理同一(Date, Country, Collateral)组合的重复记录,若数据中该组合唯一,可保留;若有重复,可改为mean(均值)、max(最大值)等。
  • 计算Bond时,pandas会自动处理缺失情况:只要Pool或Single任一缺失,结果为NaN;两者都缺失时结果也为NaN,符合需求。
  • merge使用how='left'保证原DataFrame所有行被保留,仅匹配对应的Bond值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:57:35