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

基于Pandas按Desc列筛选if列并保留关联列数据的技术问询

Pandas筛选关联数据并优化合并流程

场景说明

现有两个CSV文件,通过pd.concat(axis=1)合并得到TestMerge.csv,需实现:

  1. 筛选出if(C)列值存在于Desc(A)列的行;
  2. 保留Desc(A)与ONT(B)、if(C)与Status(D)的关联关系;
  3. 确认是否可在合并前完成筛选。

原始合并代码及数据集结构如下:

import pandas as pd

df_1 = pd.read_csv('TEST_ifDescr.csv')
df_2 = pd.read_csv('WG_ifOperStatus.csv')
frames = [df_1, df_2]
df = pd.concat(frames, sort=False, axis=1)
df.to_csv('TestMerge.csv', index=False)
TestMerge.csv
Desc(A)      ONT(B)         if(C)       Status(D)
16292413441  ADTN210784db   25300071    down
16292423681  ADTN21078135   25300072    down
16292433921  ADTN210780ef   25300200    up
16292444161  ADTN2039e094   25300201    up
16292454401  ADTN201242db   1627653120  up
16292464641  ADTN2019306c   1627653185  up

期望输出:

Desc(A)      ONT(B)         if(C)       Status(D)
16292413441  ADTN210784db   16292413441 down
16292423681  ADTN21078135   16292423681 down
16292433921  ADTN210780ef   16292433921 up
16292444161  ADTN2039e094   16292444161 up
16292454401  ADTN201242db   16292454401 up

可行实现方案

方案一:合并时直接关联筛选(推荐)

原concat(axis=1)依赖行索引对齐,极易出现关联错误。改用pd.merge按匹配键内连接,自动筛选出Desc(A)与if(C)值相等的行,同时保证关联关系准确:

import pandas as pd

# 读取原始文件
df_1 = pd.read_csv('TEST_ifDescr.csv')
df_2 = pd.read_csv('WG_ifOperStatus.csv')

# 统一匹配列类型为字符串,避免类型不匹配导致的筛选失败
df_1['Desc(A)'] = df_1['Desc(A)'].astype(str)
df_2['if(C)'] = df_2['if(C)'].astype(str)

# 内连接:仅保留两列值匹配的行
merged_df = pd.merge(df_1, df_2, left_on='Desc(A)', right_on='if(C)', how='inner')

# 调整列顺序为期望格式
result_df = merged_df[['Desc(A)', 'ONT(B)', 'if(C)', 'Status(D)']]

# 输出并保存结果
print(result_df)
result_df.to_csv('Filtered_TestMerge.csv', index=False)

方案二:合并后筛选(适用于已有合并文件的场景)

如果已生成TestMerge.csv,可直接读取后筛选:

import pandas as pd

df = pd.read_csv('TestMerge.csv')

# 统一类型
df['Desc(A)'] = df['Desc(A)'].astype(str)
df['if(C)'] = df['if(C)'].astype(str)

# 筛选if(C)值存在于Desc(A)集合中的行
filtered_df = df[df['if(C)'].isin(df['Desc(A)'])]

# 输出或保存
print(filtered_df)
filtered_df.to_csv('Filtered_TestMerge.csv', index=False)

方案三:合并前完成筛选(完全可行)

提前筛选能减少后续计算的数据量,提升效率,步骤如下:

import pandas as pd

df_1 = pd.read_csv('TEST_ifDescr.csv')
df_2 = pd.read_csv('WG_ifOperStatus.csv')

# 统一类型
df_1['Desc(A)'] = df_1['Desc(A)'].astype(str)
df_2['if(C)'] = df_2['if(C)'].astype(str)

# 提取Desc(A)的唯一值集合
desc_values = set(df_1['Desc(A)'])

# 提前筛选df_2中符合条件的行
filtered_df_2 = df_2[df_2['if(C)'].isin(desc_values)]

# 合并筛选后的df_2与df_1
merged_df = pd.merge(df_1, filtered_df_2, left_on='Desc(A)', right_on='if(C)', how='inner')
result_df = merged_df[['Desc(A)', 'ONT(B)', 'if(C)', 'Status(D)']]

print(result_df)

关键建议

  • 优先用merge替代concat:concat(axis=1)依赖行索引,无法保证数据关联的准确性,merge通过指定关联键能避免此类问题。
  • 统一匹配列类型:必须将Desc(A)和if(C)转为相同类型(如字符串),否则会因数值/字符串类型差异导致匹配失败。
  • 大数据量优先提前筛选:若原始数据规模较大,合并前先筛选目标行,能显著降低内存占用和计算耗时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:36:20