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

如何在DataFrame中按A列匹配保留行?现有join代码未达预期

实现DataFrame按条件保留列的需求

原始DataFrame

A         B    C    D        E   F   G  H       I      J 
FP002    12     FP001   113 406 519  85 82  FP001   6240
FP003    7610   FP002   99  552 651  49 64  FP002   12294
FP005    12,    FP003   102 131 1416 24  89 FP003   761
FP005    1250   FP004   94  739 833 122 215 FP004   400

期望输出

A         B    C         D   E       F       G       H       I       J
FP002    12     FP002   99  552     651      49      64   FP002   12294
FP003    7610   FP003   102 1314    1416    247      89   FP003  761
FP005    12,    
FP005    1250   

核心需求

当某行的C列值与A列值相同时,保留该行所有列;否则仅保留A、B两列。

问题分析

你之前使用的df1.join(df1, on=['A','C'], how='inner')是做表内连接,逻辑是找出两表中A和C同时匹配的行,这和“判断当前行自身的C是否等于A”的需求完全不符,因此无法得到正确结果。

解决方案

方法一:通过掩码批量修改列值

这种方法直接在原DataFrame上修改,效率较高:

import pandas as pd
import numpy as np

# 构造示例DataFrame(根据你的原始数据整理)
data = {
    'A': ['FP002', 'FP003', 'FP005', 'FP005'],
    'B': ['12', '7610', '12,', '1250'],
    'C': ['FP001', 'FP002', 'FP003', 'FP004'],
    'D': [113, 99, 102, 94],
    'E': [406, 552, 131, 739],
    'F': [519, 651, 1416, 833],
    'G': [85, 49, 24, 122],
    'H': [82, 64, 89, 215],
    'I': ['FP001', 'FP002', 'FP003', 'FP004'],
    'J': [6240, 12294, 761, 400]
}
df = pd.DataFrame(data)

# 生成判断掩码:C列等于A列的行标记为True
mask = df['C'] == df['A']

# 复制原DataFrame,对不满足条件的行,将除A、B外的列设为空值
result = df.copy()
result.loc[~mask, df.columns.difference(['A', 'B'])] = np.nan

# 将空值替换为空字符串,匹配期望输出格式
result = result.fillna('')

# 打印结果
print(result.to_string(index=False))

方法二:拆分后合并

这种方法逻辑更直观,适合新手理解:

import pandas as pd

# 构造示例DataFrame(同上)
data = {
    'A': ['FP002', 'FP003', 'FP005', 'FP005'],
    'B': ['12', '7610', '12,', '1250'],
    'C': ['FP001', 'FP002', 'FP003', 'FP004'],
    'D': [113, 99, 102, 94],
    'E': [406, 552, 131, 739],
    'F': [519, 651, 1416, 833],
    'G': [85, 49, 24, 122],
    'H': [82, 64, 89, 215],
    'I': ['FP001', 'FP002', 'FP003', 'FP004'],
    'J': [6240, 12294, 761, 400]
}
df = pd.DataFrame(data)

# 筛选满足条件的行(C==A),保留所有列
keep_all_rows = df[df['C'] == df['A']]

# 筛选不满足条件的行,仅保留A、B列,补充其他列为空字符串
keep_ab_rows = df[df['C'] != df['A']][['A', 'B']]
for col in df.columns.difference(['A', 'B']):
    keep_ab_rows[col] = ''

# 合并结果并保持原始行顺序
final_result = pd.concat([keep_all_rows, keep_ab_rows], axis=0).sort_index()

# 打印结果
print(final_result.to_string(index=False))

内容的提问来源于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.08 17:53:16