python - 根据第二个 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)
解决方案
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 数据帧中使用迭代。性能会很差,你会失去这个库的真正力量)
推荐阅读
- php - Laravel 站点地图生成器输出空文件
- tensorflow - 具有多对一 LSTM 的 TimeSeriesGenerator
- javascript - 将文档文件转换为 JSON
- odoo - 为什么我需要创建类型为 Register Consumed Material 的 quality.point 记录以从平板电脑视图消耗非跟踪产品?OdooV13
- database - 我们可以在源 MongoDB 中有多个分片,而在备份数据库中没有分片或更少分片吗
- mongodb - 如何用猫鼬在mongodb中反转布尔值
- angular7 - TypeError:无法读取未定义的属性“getUserMedia”
- javascript - 我们如何在使用 React 刷新页面之前调用一个函数
- tree - Yacc树形建筑
- python - 芹菜日志被写入旧日志文件