【问题标题】:Easiest way to delete rows with a column value matching value in separate file list?在单独的文件列表中删除列值匹配值的行的最简单方法?
【发布时间】:2018-07-21 07:22:42
【问题描述】:

我有两个文件,file1 是一个包含数百行和 12 列的 csv,file2 是一个包含数百个值的列表。

比较 file1, col(0) 中的每个值与文件 2 中的每个值,然后如果与 file2 中的任何值匹配则删除 file1 行的最简单方法是什么?

我尝试使用此代码进行匹配部分,但出现语法错误,我认为是因为 python 不允许两个并发阅读器:

initialAvail = open('py_all1.csv')
Reader1 = csv.reader(initialAvail)
data_list1 = list(csv.reader(initialAvail))
IpodPLexcl = open('ipod_py.csv', 'a') 
Reader2 = csv.reader(IpodPLexcl)
data_list2 = list(csv.reader(IpodPLexcl))

for i in range(1, len(data_list1)):
        Reader1item = int(data_list1[i][0])
        for j in range(1, len(data_list2)):
                Reader2item = int(data_list2[i][0])
                if Reader1item == Reader2item:
                        compareMatch = True
                        print(compareMatch)

我是否必须做一个字典(因为第二个文件只是一个列表,而不是具有多个列的 csv)?

【问题讨论】:

  • 分解问题: 1. 读取内存中的文件。 2. 应用规则。 3.如果存在更改,则覆盖原始文件。
  • 也许你是对的,因为这些文件比这一步之前的原始文件小。会试试的。
  • 离题:我强烈建议您阅读并开始遵循 PEP 8 - Style Guide for Python Code 命名准则,尤其是 variable names
  • 看看 pandas 库以在 python 中操作表。几个小时,您将在未来节省很多时间。

标签: python csv


【解决方案1】:

如果您愿意使用 pandas 库,那么一个简单的代码将为您提供所需的结果:

假设:py_all1.csv 是我们要从中删除行的文件。

import pandas as pd

df1 = pd.read_csv('py_all1.csv') # file with multiple columns
df2 = pd.read_csv('ipod_py.csv') # file with one column

mask = df1.iloc[:,0].isin(df2.iloc[:,0])
df1[~mask].to_csv('output.csv', index=False)
# change output.csv to 'py_all1.csv' if desired output

我用这个示例数据进行了尝试:

file1_data = '''\
A,B
New York,1
Paris,2
London,3
'''

file2_data= '''\
A
New York
Paris'''

with open('py_all1.csv','w') as f1, open('ipod_py.csv','w') as f2:
    f1.write(file1_data)
    f2.write(file2_data)

结果是:

A,B
London,3

【讨论】:

  • 优秀。我不够聪明,无法理解文档,所以我很欣赏这个例子。如果我现在明白了……
  • 如果不是像mask = df1.iloc[:,0].isin(df2.iloc[:,0]) 那样根据匹配数据删除行,而是从 df1 中删除具有偏移值的行,例如第 2 列,该怎么办?另一种表达方式是从 df1 为 df1 col 0 和 df2 col 0 匹配的那些行输出 col 2 值的列表。
  • 好的,你只需要像mask = df1.iloc[:,2].isin(df2.iloc[:,0]) df1[mask].to_csv('output.csv', index=False)一样删除波浪号,然后你可以像第一个例子一样使用生成的文件。熊猫很棒!
  • 另一个相关问题...在您的示例中file1_data = '''\ A,B New York,1 Paris,2 London,3 ''' 这些值仅出现一次。如果在 file1_data 下它们出现多次,则代码不会删除所有值。有解决办法吗?
  • @user3447273 好的,等等,现在唯一的问题是您的最后一个问题。我没有看到任何问题,代码应该有效地删除 file2 第一列中的所有项目。如果你能提供一个样本,我很可能会提供帮助。通过搜索“{my question} pandas”,您很可能会在 SO 上找到答案(有很多问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2016-05-11
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
相关资源
最近更新 更多