繁体   English   中英

Python:从大型数据集创建新的csv的有效方法

[英]Python: efficient way to create new csv from large dataset

我有一个脚本,可以从元素主列表中删除“不良元素”,然后返回包含已更新元素及其关联值的csv。

我的问题是在for循环中是否有更有效的方法执行相同的操作?

Master=pd.read_csv('some.csv', sep=',',header=0,error_bad_lines=False)

MasterList = Master['Elem'].tolist()
MasterListStrain1 = Master['Max_Principal_Strain'].tolist()

#this file should contain elements that are slated for deletion
BadElem=pd.read_csv('delete_me_elements_column.csv', sep=',',header=None, error_bad_lines=False)
BadElemList = BadElem[0].tolist() 

NewMasterList = (list(set(MasterList) - set(BadElemList)))

filename = 'NewOutput.csv'
outfile = open(filename,'w')

#pdb.set_trace()


for i,j in enumerate(NewMasterList):
    #pdb.set_trace()
    Elem_Loc = MasterList.index(j)
    line ='\n%s,%.25f'%(j,MasterListStrain1[Elem_Loc])
    outfile.write(line)  


print ("\n The new output file will be named: " + filename)


outfile.close()

阶段1

如果您一定要在for循环中进行迭代,则除了使用pd.to_csv可能会提高性能的方法外,还可以执行以下操作:

...
SetBadElem = set(BadElemList)
...
for i,Elem_Loc in enumerate(MasterList):
    if Elem_Loc not in SetBadElem:
        line ='\n%s,%.25f'%(j,MasterListStrain1[Elem_Loc])
        outfile.write(line)  

在索引周围跳转永远不会高效,而带有跳过的迭代将为您提供更好的性能(检查集合中的存在是否为log n操作,因此相对较快)。

阶段2正确使用熊猫

...
SetBadElem = set(BadElemList)
...
for Elem in Master:
    if Elem not in SetBadElem:
        line ='\n%s,%.25f'%(Elem['elem'], Elem['Max_Principal_Strain'])
        outfile.write(line)  

无需从pandas数据框列中创建列表。 使用整个数据框(并为其建立索引)是一种更好的方法。

阶段3删除杂乱的迭代格式化操作

我们可以添加将包含格式化数据的列(“格式化”)。 为此,我们将创建一个lambda函数

formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain'])

Master['Formatted'] = Master.apply(formatter)

阶段4熊猫式滤波和输出

我们可以通过两种方式格式化数据框。 我的首选是重用格式化功能:

import numpy as np
formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain']) if row not in SetBadElem else np.nan

现在我们可以使用内置的dropna删除所有具有NaN值的行

Master.dropna()  
Master.to_csv(filename)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM