Python pandas如何循环遍历Counter字段生成子集DataFrame并合并
自动遍历Counter字段生成子集并合并的实现方案
不需要手动逐一定义每个Counter值对应的子集,通过遍历Counter列的唯一取值即可自动适配任意数量的Counter枚举值,实现逻辑和手动编写的小规模示例完全对齐。
完整实现代码
import pandas as pd from functools import reduce # 原始数据集 data = {'name': ['Adam','Adam','Adam','Adam', 'nick','nick','nick','nick','nick','krish','krish','krish',], 'age': [20,20,20,20, 21,21,21,21,21, 19,19,19], 'Product': ['A','B','C','D','A','B','C','D','E','A','B','C'], 'Counter': [1,2,3,4,1,2,3,4,5,1,2,3]} df = pd.DataFrame(data) # 自动生成所有Counter值对应的子集列表 dfs = [] # 遍历Counter列去重后的排序值,保证子集顺序和手动实现一致 for counter_val in sorted(df['Counter'].unique()): # 筛选当前Counter值的行,保留需要的字段 sub_df = df.loc[df['Counter'] == counter_val, ['name','age','Product']] # 为非关联列加对应Counter后缀,避免合并后列名重复 sub_df = sub_df.rename(columns={ 'age': f'age_Counter{counter_val}', 'Product': f'Product_Counter{counter_val}' }) dfs.append(sub_df) # 按name字段外连接合并所有子集,逻辑和手动实现完全一致 df_merged = reduce(lambda left,right: pd.merge(left, right, on=['name'], how='outer'), dfs)
逻辑说明
- 自动适配Counter取值:通过
df['Counter'].unique()获取Counter列所有不重复的取值,搭配sorted()保证取值按升序排列,哪怕Counter有数百个取值也不需要手动修改代码。 - 避免冗余变量定义:循环过程中自动完成子集筛选、字段裁剪,不需要逐一定义
df1/df2这类零散变量。 - 修复原手动实现的隐患:原手动代码未处理列名重复问题,合并后会存在多列同名的age、Product字段,无法区分对应哪个Counter值,上述代码通过重命名字段解决了这个问题。如果需要完全保留原手动实现的列名效果,删除
rename相关代码即可。 - 合并规则完全对齐:沿用原本使用的
reduce+外连接逻辑,以name作为关联键,合并结果和手动拼接的结果完全一致。
内容的提问来源于stack exchange,提问作者imikiei
相关产品推荐
相关产品推荐

