基于条件合并求和Pandas DataFrame指定行技术问询
解决方案:仅合并指定行求和
你遇到的问题很典型——直接用groupby(['jb_name'])会把所有相同名称的行都合并,但你只需要针对jb_name为generic的行做求和合并,其他行保持原样。这里有两种简洁的实现方式:
方法一:拆分处理后合并
这种方式逻辑直观,把数据分成两部分分别处理再合并:
import pandas as pd # 示例数据 data = { 'jb_name': ['generic', 'generic1', 'generic', 'other'], 'jb_count': [10, 2, 15, 14] } df = pd.DataFrame(data) # 1. 保留所有非generic的行,不做任何处理 non_generic_rows = df[df['jb_name'] != 'generic'] # 2. 计算generic行的总和,生成单行数据 generic_total = df[df['jb_name'] == 'generic'].agg( {'jb_name': lambda x: 'generic', 'jb_count': 'sum'} ).to_frame().T # 3. 合并两部分数据并重置索引 final_df = pd.concat([non_generic_rows, generic_total], ignore_index=True) print(final_df)
运行后输出正好符合你的预期:
jb_name jb_count 0 generic1 2 1 other 14 2 generic 25
方法二:自定义分组键
如果喜欢用groupby的方式,可以通过自定义分组键来实现精准合并:
# 给每行分配分组键:generic行归为同一组,其他行各自为一组 df['group_key'] = df['jb_name'].apply(lambda x: x if x != 'generic' else 'temp_generic') # 按分组键求和,再还原jb_name列 final_df = df.groupby('group_key')['jb_count'].sum().reset_index() final_df['jb_name'] = final_df['group_key'].replace('temp_generic', 'generic') final_df = final_df.drop('group_key', axis=1) print(final_df)
这个方法同样能得到你想要的结果,而且代码更紧凑。
两种方法的核心思路都是只对目标行做聚合,其他行完全保留原始状态,避免了全量groupby带来的不必要合并。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

