我有多个巨大的tsv文件,我试图使用pandas进行处理。我想按照' col3'分组。和' col5'。我试过这个:
import pandas as pd
df = pd.read_csv('filename.txt', sep = "\t")
g2 = df.drop_duplicates(['col3', 'col5'])
g3 = g2.groupby(['col3', 'col5']).size().sum(level=0)
print g3
到目前为止它工作正常并打印出如下输出:
yes 2
no 2
我希望能够聚合多个文件的输出,即能够同时按所有文件中的这两列进行分组,并打印一个公共输出,其总出现次数为&# 39;是'或者没有'或者那个属性可能是什么。换句话说,我现在想一次在多个文件上使用groupby。如果文件中没有其中一列,则应跳过它并转到下一个文件。
答案 0 :(得分:8)
这是blaze
的一个很好的用例。
以下是使用nyctaxi dataset中的一些简化文件的示例。我故意将一个大文件拆分成两个文件,每个文件包含1,000,000行:
In [16]: from blaze import Data, compute, by
In [17]: ls
trip10.csv trip11.csv
In [18]: d = Data('*.csv')
In [19]: expr = by(d[['passenger_count', 'medallion']], avg_time=d.trip_time_in_secs.mean())
In [20]: %time result = compute(expr)
CPU times: user 3.22 s, sys: 393 ms, total: 3.61 s
Wall time: 3.6 s
In [21]: !du -h *
194M trip10.csv
192M trip11.csv
In [22]: len(d)
Out[22]: 2000000
In [23]: result.head()
Out[23]:
passenger_count medallion avg_time
0 0 08538606A68B9A44756733917323CE4B 0
1 0 0BB9A21E40969D85C11E68A12FAD8DDA 15
2 0 9280082BB6EC79247F47EB181181D1A4 0
3 0 9F4C63E44A6C97DE0EF88E537954FC33 0
4 0 B9182BF4BE3E50250D3EAB3FD790D1C9 14
注意:这将使用pandas自己的chunked CSV阅读器执行pandas计算。如果您的文件在GB范围内,则最好转换为bcolz或PyTables等格式,因为它们是二进制格式,专为大型文件的数据分析而设计。 CSV只是带有约定的文本blob。
答案 1 :(得分:0)
一种方法是连接dfs。它会占用大量的内存。文件有多大?
filelist = ['file1.txt', 'file2.txt']
df = pd.concat([pd.read_csv(x, sep="\t") for x in filelist], axis=0)