处理连续与分类数据:按Customer_ID聚合时如何保留客户及代理性别?
问题描述
现有6位客户多次向代理申请贷款,代理可服务多位客户(如Agent 306服务Customer 1和2,Agent 309服务Customer 5和6)。需按Customer_ID聚合每位客户的贷款总额,同时保留CustomerGender(客户性别)与AgentGender(代理性别)字段。
已尝试以下Python pandas代码,但执行后仅得到数值字段的聚合结果,无法看到客户及代理性别:
import pandas as pd data = {'Customer_ID': [1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 5, 6, 6], 'Loan': [200, 250, 300, 400, 300, 500, 150, 150, 400, 250, 150, 300, 200, 200], 'CustomerGender': ['M', 'M', 'M', 'F', 'F', 'M', 'M', 'M', 'F', 'F', 'F', 'F', 'F', 'F'], 'Agent_ID': [306, 306, 306, 306, 306, 307, 308, 308, 309, 309, 309, 309, 309, 309], 'AgentGender': ['F', 'F', 'F', 'M', 'M','M', 'M', 'M', 'F', 'F', 'F', 'F', 'F', 'F'], 'settlement_value': [23.5, 30.99, 306, 86, 50, 307.35, 1200.54, 25, 48.88, 400, 2100.10, 30, 1309.10, 500.50]} # 转换为DataFrame data = pd.DataFrame(data) # 将性别字段设为分类类型 data['AgentGender']=data['AgentGender'].astype('category') data['CustomerGender']=data['CustomerGender'].astype('category') # 按Customer_ID聚合贷款总额 data.groupby(data['Customer_ID']).sum()
解决方案
问题根源在于groupby().sum()默认仅对数值型字段执行求和操作,分类/字符串类型的性别字段会被自动排除。针对同一Customer_ID对应唯一性别值的特点,可通过以下几种方式解决:
方法1:自定义聚合规则(推荐)
直接指定每个字段的聚合逻辑:对Loan求和,对性别字段取唯一值(因为同一客户的性别、代理性别不会变化):
result = data.groupby('Customer_ID').agg( 贷款总额=('Loan', 'sum'), 客户性别=('CustomerGender', 'first'), 代理性别=('AgentGender', 'first') ).reset_index()
reset_index()用于将Customer_ID从索引列转为普通字段,方便后续查看和处理。
方法2:拆分操作后合并结果
先提取去重后的客户性别信息,再计算贷款总额,最后合并两个结果:
# 获取每个客户的唯一性别信息 gender_data = data[['Customer_ID', 'CustomerGender', 'AgentGender']].drop_duplicates() # 计算每位客户的贷款总额 loan_total = data.groupby('Customer_ID')['Loan'].sum().rename('贷款总额').reset_index() # 合并数据 result = pd.merge(gender_data, loan_total, on='Customer_ID')
方法3:用transform添加总额列后去重
通过transform给每行数据添加对应客户的贷款总额,再去重得到唯一客户记录:
# 新增贷款总额列 data['贷款总额'] = data.groupby('Customer_ID')['Loan'].transform('sum') # 提取所需字段并去重 result = data[['Customer_ID', 'CustomerGender', 'AgentGender', '贷款总额']].drop_duplicates()
内容的提问来源于stack exchange,提问作者Andrea Erőss
相关产品推荐
相关产品推荐

