Pandas DataFrame复杂转换求助:按抗菌药聚合行列式与频率
解决方案
要实现频率与Determinant的对应格式,需要分两步层级聚合处理,以下是完整实现代码:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Antimicrobial': ['anti1', 'anti1', 'anti1', 'anti2'], 'Determinant': ['det1', 'det1', 'det2', 'det3'], 'Frequency': [0.8, 0.5, 0.5, 0.9] }) # 1. 先按「抗菌剂+Determinant」分组,处理单类Determinant的频率格式 def format_frequency(series): freq_list = series.tolist() if len(freq_list) > 1: return f"[{', '.join(map(str, freq_list))}]" return str(freq_list[0]) det_level_group = df.groupby(['Antimicrobial', 'Determinant'], as_index=False).agg( Frequency=('Frequency', format_frequency) ) # 2. 再按抗菌剂分组,完成最终的字段拼接 final_agg = { 'Determinant': lambda x: '; '.join(sorted(x)), 'Frequency': lambda x: '; '.join(x) } result_df = det_level_group.groupby('Antimicrobial', as_index=False).agg(final_agg) print("转换后结果:") print(result_df)
代码逻辑说明
- 第一层级聚合:先把同一抗菌剂下的同一种Determinant对应的频率整合,多值用方括号包裹、逗号分隔,单值直接转字符串,保证每个Determinant对应唯一的频率字符串
- 第二层级聚合:按抗菌剂分组后,对Determinant排序并分号连接,同时按相同顺序把对应的频率字符串分号连接,确保两者一一对应
最终输出
转换后结果: Antimicrobial Determinant Frequency 0 anti1 det1; det2 [0.8, 0.5]; 0.5 1 anti2 det3 0.9
内容的提问来源于stack exchange,提问作者Rb win
相关产品推荐
相关产品推荐

