根据Python中的列值过滤大型csv文件(10GB +)

时间:2017-09-03 16:53:26

标签: python pandas csv filter

已编辑:添加了复杂性

我有一个大的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更好吗?

3 个答案:

答案 0 :(得分:1)

使用boolean indexingDataFrame.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']