我有一个由380行和20列组成的表。我希望在某个条件下删除此表中的行。
为澄清事情,我们说我有清单:
names = ['John', 'Amy', 'Daniel']
我想删除名单在names
列表中找到的所有人的数据。
示例,让我们说我的数据看起来像这样:
John 82 3.12 boy
Katy 12 1.12 girl
Amy 42 2.45 girl
Robert 32 1.56 boy
Daniel 47 2.10 boy
我想删除John
,Amy
和Daniel
的数据。所以输出应该是:
Katy 12 1.12 girl
Robert 32 1.56 boy
import csv
import numpy as np
# loading data
data = np.genfromtxt('file.txt', dtype = None)
csvfile = "home/paula/Desktop/test.txt"
with open(csvfile, 'w') as output:
writer = csv.writer(output, delimiter = '\t')
for row in range(len(data)):
if data[row][0] == (i for i in names):
print 'removing the data of', i, '...'
else:
writer.writerow([data[row][0], data[row][1],
data[row][2], data[row][3]])
我的代码正在运行,但数据未从原始数据中删除。当我打开新的test.txt文件时,我可以看到数据没有被删除。
我确定错误发生在if data[row][0] == (i for i in names):
我该如何解决这个问题?
答案 0 :(得分:4)
应该写下这个条件:
if data[row][0] in names:
在您当前的代码中,(i for i in names)
创建一个生成器,然后您正在测试该字符串是否等于生成器对象,这将是false
>>> (i for i in names)
<generator object <genexpr> at 0x1060564b0>
>>> 'John' == (i for i in names)
False
>>>
相反,您可以测试项目是否在列表中,如下所示
>>> names = ['John', 'Amy', 'Daniel']
>>> 'John' in names
True
>>> 'Bob' in names
False
>>>
正如评论中所述,您可以在迭代行之前将names
转换为set
,从而提高效率。但理想情况下,您可以使用Pandas库来操作csv / table数据。有关类似示例,请参阅this answer。您可以使用df[~df.Name.isin(...)]
否定条件。
答案 1 :(得分:0)
您正在检查data[row][0]
是否与(i for i in names)
相同。您要做的是检查它是否与(i for i in names)
的元素之一相同。你可以这样做:
any([data[row][0]==i for i in names])
您也可以使用in
运算符以非荒谬的方式执行此操作:
data[row][0] in names
检查names
的任何元素是否与data[row][0]
相同。
答案 2 :(得分:0)
if data[row][0] == (i for i in names):
print 'removing the data of', i, '...'
该部分i
中的在(i for i in names)
中用作本地可靠的。但在下一个打印行中,您使用i
。在这里你不能使用它。
您可以使用if data[row][0] in names:
作为支票。您可以尝试:
if data[row][0] == names:
print 'removing the data of', data[row][0], '...'