使用Pandas实现多列分组后填充缺失人员名称的DataFrame
解决方案
你要实现的是将现有DataFrame中的V1/V2/V3唯一组合与完整的PN列表做笛卡尔积,不需要用groupby,用交叉连接的方式更直接:
步骤1:构造初始数据
import pandas as pd # 原DataFrame df = pd.DataFrame({ 'V1': [1, 2, 3], 'V2': [10, 10, 10], 'V3': [20, 21, 20], 'PN': ['A', 'A', 'C'] }) # 完整的PN列表 pn_list = ['A', 'B', 'C', 'D', 'E'] pn_df = pd.DataFrame({'PN': pn_list})
步骤2:提取唯一的V1/V2/V3组合
先去掉原数据中的PN列,然后去重得到所有需要配对的键组合:
unique_groups = df.drop('PN', axis=1).drop_duplicates()
步骤3:执行交叉连接生成结果
用merge方法,指定how='cross'来实现笛卡尔积:
result = unique_groups.merge(pn_df, how='cross')
最终结果
运行后result就是你期望的输出:
V1 V2 V3 PN 0 1 10 20 A 1 1 10 20 B 2 1 10 20 C 3 1 10 20 D 4 1 10 20 E 5 2 10 21 A 6 2 10 21 B 7 2 10 21 C 8 2 10 21 D 9 2 10 21 E 10 3 10 20 A 11 3 10 20 B 12 3 10 20 C 13 3 10 20 D 14 3 10 20 E
补充说明
how='cross'是Pandas 1.2.0及以上版本支持的语法,如果版本较低,可以用unique_groups.assign(key=1).merge(pn_df.assign(key=1), on='key').drop('key', axis=1)来替代。- 这种方式比groupby更高效,因为本质是要生成所有键与PN的组合,而非分组聚合。
内容的提问来源于stack exchange,提问作者Parth Rathod
相关产品推荐
相关产品推荐

