基于多分组条件在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
相关产品推荐
相关产品推荐

