已编辑:添加了复杂性
我有一个大的csv文件,我想根据列值过滤掉行。例如,请考虑以下CSV文件格式:
Col1,Col2,Nation,State,Col4...
a1,b1,Germany,state1,d1...
a2,b2,Germany,state2,d2...
a3,b3,USA,AL,d3...
a3,b3,USA,AL,d4...
a3,b3,USA,AK,d5...
a3,b3,USA,AK,d6...
我想用Nation == 'USA'
过滤所有行,然后根据50状态中的每一行过滤。这样做最有效的方法是什么?我使用的是Python。感谢
此外,对于此类任务,R比Python更好吗?
答案 0 :(得分:1)
使用boolean indexing
或DataFrame.query
:
df1 = df[df['Nation'] == "Japan"]
或者:
df1 = df.query('Nation == "Japan"')
第二个应该更快,请参阅performance of query。
如果仍然不可能(不是很多RAM)请尝试使用dask作为评论的Jon Clements(谢谢)。
答案 1 :(得分:0)
一种方法是首先过滤csv,然后在给定数据大小的情况下加载
import csv
with open('yourfile.csv', 'r') as f_in:
with open('yourfile_edit.csv', 'w') as f_outfile:
f_out = csv.writer(f_outfile, escapechar=' ',quoting=csv.QUOTE_NONE)
for line in f_in:
line = line.strip()
row = []
if 'Japan' in line:
row.append(line)
f_out.writerow(row)
现在加载csv
df = pd.read_csv('yourfile_edit.csv', sep = ',',header = None)
你得到了
0 1 2 3 4
0 2 a3 b3 Japan d3
答案 2 :(得分:0)
您可以打开文件,索引Nation
标头的位置,然后迭代reader()
。
import csv
temp = r'C:\path\to\file'
with open(temp, 'r', newline='') as f:
cr = csv.reader(f, delimiter=',')
# next(cr) gets the header row (row[0])
i = next(cr).index('Nation')
# list comprehension through remaining cr iterables
filtered = [row for row in cr if row[i] == 'Japan']