pandas如何将列值转为独立列并按分组聚合对应值
Pandas分组聚合转宽表实现方案
实现逻辑
- 以
Groups列为行分组维度 - 将
Species_2列的所有唯一值展开为单独列 - 同组同列下匹配到的多个
Species_1值用;拼接,无匹配值填充NA
完整实现代码
import pandas as pd # 加载测试数据 test_data = {'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G1', 5: 'G2', 6: 'G2', 7: 'G3'}, 'Species_1': {0: 'SP1_A', 1: 'SP1B', 2: 'SP2_AZ', 3: 'SP3_12:A', 4: 'SP4-2', 5: 'SP1_2', 6: 'SP3:21', 7: 'SP5(2)'}, 'Species_2': {0: 'SP1', 1: 'SP1', 2: 'SP2', 3: 'SP3', 4: 'SP4', 5: 'SP2', 6: 'SP3', 7: 'SP5'}} df = pd.DataFrame(test_data) # 核心方法1:pivot_table透视实现 result = df.pivot_table( index='Groups', columns='Species_2', values='Species_1', aggfunc=lambda x: ';'.join(x), fill_value=pd.NA ).reset_index() result.columns.name = None # 核心方法2:groupby+unstack实现,效果和方法1完全一致 # result = df.groupby(['Groups', 'Species_2'])['Species_1'].agg(';'.join).unstack(fill_value=pd.NA).reset_index() # result.columns.name = None # 若需要将缺失值显示为字符串NA,取消注释下一行即可 # result = result.fillna('NA') print(result)
输出结果
Groups SP1 SP2 SP3 SP4 SP5 0 G1 SP1_A;SP1B SP2_AZ SP3_12:A SP4-2 <NA> 1 G2 <NA> SP1_2 SP3:21 <NA> <NA> 2 G3 <NA> <NA> <NA> <NA> SP5(2)
注:如果执行
fillna('NA')步骤,输出中的<NA>会替换为字符串NA,和示例展示效果完全一致。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

