我是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。我不知道如何才能做到这一点。
答案 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']]