首页 > 解决方案 > 根据第二个 csv 过滤一个 csv

问题描述

在读取两个 CSV 文件 A 和 B 后,我想删除 B 中前两列与 A 中任何行的前两列不匹配的所有行。然后将 B 保存到磁盘。

这是我到目前为止所拥有的:

 A =  pd.read_csv('A.csv', header=None)
 B = pd.read_csv('B.csv', header = None)
 for row_A in A.iterrows():
     foundMatch = False
     for row_B in B.iterrows():
         if (row_A[0] == row_B[0] and row_A[1] == row_B[1]) :
             foundMatch = True
             break
     if (!foundMatch)
         # delete row from B
  B.to_csv('B_filtered.csv', index=False, header=None)

标签: pythonpandas

解决方案


IIUC,给定两个数据框:

dfa = pd.DataFrame({"col1": ["str{}".format(i) for i in range(10)], 
                   "col2": ["str{}".format(chr(i)) for i in range(97,107)]})

    col1    col2
0   str0    stra
1   str1    strb
2   str2    strc
3   str3    strd
4   str4    stre
5   str5    strf
6   str6    strg
7   str7    strh
8   str8    stri
9   str9    strj

dfb = pd.DataFrame({"col1": ["str0", "str1", "str1000"],
                    "col2": ["stra", "strb", "strc"]})

    col1    col2
0   str0    stra
1   str1    strb
2   str1000 strc

您可以先将transform前两列变为tuples(以及因此可散列的对象),然后用于isin检查 A 中是否存在这样的对df,即

>>> dfa.transform(tuple, 1)
0    (str0, stra)
1    (str1, strb)
2    (str2, strc)
3    (str3, strd)
4    (str4, stre)
5    (str5, strf)
6    (str6, strg)
7    (str7, strh)
8    (str8, stri)
9    (str9, strj)

所以

df_final = dfb.loc[dfb.transform(tuple, 1).isin(dfa.transform(tuple, 1))]

这使

    col1    col2
0   str0    stra
1   str1    strb

然后直接保存to_csv

df_final.to_csv("result.csv")

(旁注:尽可能不要在 pandas 数据帧中使用迭代。性能会很差,你会失去这个库的真正力量)


推荐阅读