You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据DataFrame中A列的值筛选保留指定数据行

问题描述

我有如下结构的DataFrame:

A    B     C    D     E    F
A3   25    26   A1    36    39
A3   10    10   A4    10    10
A5   66   22    A2    26    26
A6   66   26    A3    35    36
A7   34   36    A5    66    22

希望根据A列的值筛选保留部分数据,得到如下输出(注意:相同A列值对应的B列与C列之和等于E列与F列之和):

A    B     C    D     E    F
A3   25    26   A3    35    36
A3   10    10   A5    66    22
A5   66   22    NA    NA    NA
A6   66   26    NA    NA    NA
A7   34   36    NA    NA    NA
解决方案

核心逻辑

先提取原始数据中D列值存在于A列的行,将这些行的(D,E,F)作为匹配资源,分配给A列对应值的行;其余行的D/E/F设为缺失值(NA)。

代码实现

import pandas as pd
import numpy as np

# 构建初始DataFrame
data = {
    'A': ['A3', 'A3', 'A5', 'A6', 'A7'],
    'B': [25, 10, 66, 66, 34],
    'C': [26, 10, 22, 26, 36],
    'D': ['A1', 'A4', 'A2', 'A3', 'A5'],
    'E': [36, 10, 26, 35, 66],
    'F': [39, 10, 26, 36, 22]
}
df = pd.DataFrame(data)

# 提取可用的匹配项:筛选D列值在A列中的行,转为字典列表
a_unique = set(df['A'])
match_records = df[df['D'].isin(a_unique)][['D', 'E', 'F']].to_dict('records')

# 处理需要分配匹配项的行
target_rows = df[df['A'].isin([item['D'] for item in match_records])].copy()
for idx in range(len(target_rows)):
    target_rows.iloc[idx, 3:] = pd.Series(match_records[idx])

# 处理无需分配的行,设置D/E/F为缺失值
rest_rows = df[~df['A'].isin([item['D'] for item in match_records])].copy()
rest_rows[['D', 'E', 'F']] = np.nan

# 合并结果并按A列排序
final_df = pd.concat([target_rows, rest_rows]).sort_values('A').reset_index(drop=True)
print(final_df)

运行结果

A   B   C    D     E     F
0  A3  25  26  A3  35.0  36.0
1  A3  10  10  A5  66.0  22.0
2  A5  66  22  NaN   NaN   NaN
3  A6  66  26  NaN   NaN   NaN
4  A7  34  36  NaN   NaN   NaN

内容的提问来源于stack exchange,提问作者kiwi_kimchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:40:27