使用Pandas GroupBy按条件替换列中特定字符并调整内容
分组替换并添加后缀的实现方案
原始DataFrame
import pandas as pd df = pd.DataFrame({ 'ACCOUNT': [1, 1, 2, 2], 'ASSET_CLASS': ['11201XX FI CHF', '11201XX FI CHF', '12201XX FI EUR', '12201XX FI EUR', ], }) display(df)
输出:
ACCOUNT ASSET_CLASS 0 1 11201XX FI CHF 1 1 11201XX FI CHF 2 2 12201XX FI EUR 3 2 12201XX FI EUR
需求
以ACCOUNT为分组变量,使用groupby函数,针对每个账户的ASSET_CLASS列完成以下操作:
- 将列中的"XX"分别替换为"01"和"02"
- 替换为"01"时,在末尾添加后缀"Gov";替换为"02"时添加后缀"Corporate"
期望结果
df_result = pd.DataFrame({ 'ACCOUNT': [1, 1, 2, 2], 'ASSET_CLASS': ['1120101 FI CHF Gov', '1120102 FI CHF Corporate', '1220101 FI EUR Gov', '1220102 FI EUR Corporate', ], }) display(df_result)
输出:
ACCOUNT ASSET_CLASS 0 1 1120101 FI CHF Gov 1 1 1120102 FI CHF Corporate 2 2 1220101 FI EUR Gov 3 2 1220102 FI EUR Corporate
实现方案
方法一:自定义分组处理函数
通过groupby结合apply,自定义函数处理每个分组:
import pandas as pd def process_group(group): # 定义替换规则:替换值 + 对应后缀 replace_rules = [("01", "Gov"), ("02", "Corporate")] base_str = group['ASSET_CLASS'].iloc[0] new_asset_classes = [] for repl_val, suffix in replace_rules: new_str = base_str.replace("XX", repl_val) + f" {suffix}" new_asset_classes.append(new_str) # 返回处理后的分组DataFrame return pd.DataFrame({ 'ACCOUNT': [group['ACCOUNT'].iloc[0]] * 2, 'ASSET_CLASS': new_asset_classes }) # 分组处理并合并结果 df_result = df.groupby('ACCOUNT', group_keys=False).apply(process_group).reset_index(drop=True) display(df_result)
方法二:Lambda简洁实现
直接在groupby.apply中用lambda表达式完成赋值,代码更紧凑:
df_result = df.groupby('ACCOUNT').apply( lambda g: g.assign( ASSET_CLASS = [ g['ASSET_CLASS'].iloc[0].replace("XX", "01") + " Gov", g['ASSET_CLASS'].iloc[0].replace("XX", "02") + " Corporate" ] ) ).reset_index(drop=True) display(df_result)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

