删除CSV文件中不需要的行

时间:2014-07-21 11:34:51

标签: python

我是Python的新手,我遇到了删除csv文件中不需要的行的问题。例如,我有3列和很多行:

A      B     C
hi     1.0   5
hello  2.0   6
ok     3.0   7

我使用numpy(而不是csv)

加载数据
import numpy as np
a= np.loadtxt('data.csv' , delimiter= ',' , skiprows= 1)

我想介绍第二列的范围

b=np.arange(0, 2.1,0.1) 

我不知道如何使用这段代码。

我想要的最终输出如下:

A      B     C
hi     1.0   5
hello  2.0   6

最后一行将被删除,因为我选择了第二列的范围,最多只有2.0。我不知道如何才能做到这一点。

3 个答案:

答案 0 :(得分:2)

尝试使用Pandas:

import pandas as pd

a = pd.read_csv('data.csv', index_col=0) # column A will be the index.
a

       B  C
A          
hi     1  5
hello  2  6
ok     3  7

对于B到2的每个值:

a[a.B <= 2]

       B  C
A          
hi     1  5
hello  2  6

详细信息:

a.B

A
hi       1
hello    2
ok       3
Name: B, dtype: float64

a.B <= 2

A
hi        True
hello     True
ok       False
Name: B, dtype: bool

答案 1 :(得分:1)

您可以使用逻辑索引

来完成
 index = (x[:, 1] <= 2.0)

然后

 x = x[index]

仅选择满足此条件的行

答案 2 :(得分:1)

您可以使用csv模块。 N.B以下内容要求CSV字段以逗号分隔,而不是以制表符分隔(如示例所示)。

import csv

with open('data.csv') as data:
    reader = csv.reader(data)    # or csv.reader(data, delimiter='\t') for tabs
    field_names = next(reader)
    filtered_rows = [row for row in reader if 0 <= float(row[1]) <= 2.0]

>>> field_names
['A', 'B', 'C']
>>> filtered_rows
[['hi', '1.0', '5'], ['hello', '2.0', '6']]
>>> filtered_rows.insert(0, field_names)
>>> filtered_rows
[['A', 'B', 'C'], ['hi', '1.0', '5'], ['hello', '2.0', '6']]

如果您要求值在所需范围内精确到十分之一,那么您可以这样做:

import csv
import numpy as np

allowed_values = np.arange(0, 2.1, 0.1)
with open('data.csv') as data:
    reader = csv.reader(data)
    field_names = next(reader)
    filtered_rows = [row for row in reader if float(row[1]) in allowed_values]

在更新要求后进行修改

对列&#34; C&#34;有额外限制,例如值必须> = 6。

import csv
import numpy as np

allowed_values_B = np.arange(0, 2.1, 0.1)
def accept_row(row):
    return (float(row[1]) in allowed_values_B) and (int(row[2]) >= 6)

with open('data.csv') as data:
    reader = csv.reader(data)
    field_names = next(reader)
    filtered_rows = [row for row in reader if accept_row(row)]

>>> filtered_rows
[['hello', '2.0', '6']]