如何在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
相关产品推荐
相关产品推荐

