Pandas:字段组合去重并求和、移除含特定值行的实现问题
解决Pandas中的组合去重与求和需求
我来帮你搞定这个数据处理需求!你的核心目标是把Field1/Value1和Field2/Value2这两组列做长格式合并,然后按id+Field组合去重并对Value求和,同时处理缺失行。之前用stack没得到预期结果,是因为直接stack会把所有列都转成行,反而不如拆分两组再合并更精准。
分步实现代码
先构造你的输入数据(注意缺失值用pd.NA填充):
import pandas as pd # 模拟输入数据,补全缺失值 data = { 'id': [1, 1, 2, 3, 4, 3, 4], 'Field1': ['A', 'A', 'A', 'C', 'E', 'A', 'F'], 'Value1': [1, 0, 1, 1, 0, 1, 1], 'Field2': ['B', pd.NA, 'D', 'A', pd.NA, 'C', pd.NA], 'Value2': [0, pd.NA, 1, 0, pd.NA, 1, pd.NA] } df = pd.DataFrame(data)
接下来执行核心处理步骤:
# 1. 拆分两组字段并统一列名 # 处理Field1+Value1组 df_group1 = df[['id', 'Field1', 'Value1']].rename(columns={'Field1': 'Field', 'Value1': 'Value'}) # 处理Field2+Value2组,同时过滤掉Field为空的行(因为部分行没有Field2) df_group2 = df[['id', 'Field2', 'Value2']].rename(columns={'Field2': 'Field', 'Value2': 'Value'}).dropna(subset=['Field']) # 2. 合并两组数据为长格式 long_format_df = pd.concat([df_group1, df_group2], ignore_index=True) # 3. 按id和Field组合去重,对Value求和 final_result = long_format_df.groupby(['id', 'Field'], as_index=False)['Value'].sum() # 4. (可选)移除包含特定值的行,比如移除Value=0的行 # final_result = final_result[final_result['Value'] != 0] # 或者移除Field为某个值的行,比如移除Field='B'的行 # final_result = final_result[final_result['Field'] != 'B'] print(final_result)
代码解释
- 拆分合并:把
Field1/Value1和Field2/Value2拆成两组,统一列名后合并,这样所有的Field和Value都在同一列里,方便后续分组。 - 过滤缺失行:用
dropna(subset=['Field'])去掉没有Field2的行,避免无效数据干扰。 - 分组求和:
groupby(['id', 'Field'])实现了id+Field的组合去重,sum()自动对同一组合的Value求和,完美匹配你的输出需求。
运行后得到的结果和你给出的预期输出完全一致:
id Field Value 0 1 A 1 1 1 B 0 2 2 A 1 3 2 D 1 4 3 A 1 5 3 C 2 6 4 E 0 7 4 F 1
内容的提问来源于stack exchange,提问作者Nani
相关产品推荐
相关产品推荐

