在python中使用大型csv
我有一个csv文件中的大表,它有500万行和4列。 我的目标是从第一个500k中提取每一行,并根据特定条件将其与以下所有行(即5kk-n)进行比较。这种情况有点像 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和行(n)。列3==行(n+1)。列3 或 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和 行(n+1).column4.split()[0]位于行(n).column4中 现在我使用的是简单的循环列表:在python中使用大型csv,python,csv,numpy,pandas,Python,Csv,Numpy,Pandas,我有一个csv文件中的大表,它有500万行和4列。 我的目标是从第一个500k中提取每一行,并根据特定条件将其与以下所有行(即5kk-n)进行比较。这种情况有点像 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和行(n)。列3==行(n+1)。列3 或 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和 行(n+1).column4.split()[0]位于行(n).column4中 现在我使用的是简单的循环列表: for idx,i in
for idx,i in enumerate(big[:500000]):
for jdx,j in enumerate(big):
if (jdx>idx and i[0]==j[0] and i[1]==j[1] and i[2]==j[2]) or (i[0]==j[0] and i[1]==j[1] and j[3].split()[0] if j[3].split() else '' in i[3]):
matches.append([idx,jdx])
这显然需要很长时间才能完成(使用单个进程大约需要一周)。
Pandas和numpy对于一次对整个阵列进行操作是很好的,但我不知道我是否能够以某种方式将此任务转换为它们
因此,问题是,如何加快进程?我最终使用以下方法来提高性能
您正在执行大约1.2万亿个if语句。由于整个数据集都在主内存中,因此I/O不应该是个问题。如果需要一周的时间,那么每秒执行大约200万条If语句,听起来速度相当快。我想知道即使整个循环是用C编写的,它也会快多少?它可能不会改变执行时间,但是-您可以重构逻辑语句中的术语:
如果I[0]==j[0]和I[1]==j[1]和((jdx>idx和I[2]==j[2])或(j[3].split()[0]如果j[3],split()[0]如果j[3].split else''在I[3]))
通过在正确的范围内生成索引来避免这种情况:jdx>idx。这将节省一些浪费的时间。shift允许您将整个数组与移位的行进行比较,您可以使用numpy或pandas快速完成所做的操作,例如,您可以获取数据的一部分(导入numpy或pandas)然后使用您的标准筛选它们,因为您所做的只是在arhuaco连续3次的rowsGood搜索之间寻找匹配项。如果您执行“对于idx,枚举中的i(大[:500000]):对于jdx,枚举中的j(大[idx:]):”您将减少迭代次数。