Python:从大型数据集创建新 csv 的有效方法
Python: efficient way to create new csv from large dataset
我有一个脚本可以从元素的主列表中删除 "bad elements",然后 returns 一个包含更新元素及其关联值的 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 阶段正确使用Pandas
...
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 删除杂乱的迭代格式化操作
我们可以添加一个包含格式化数据的列 ('Formatted')。为此,我们将创建一个 lambda function:
formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain'])
Master['Formatted'] = Master.apply(formatter)
阶段 4Pandas-路过滤和输出
我们可以通过两种方式格式化数据框。我的偏好是重用格式化功能:
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)
我有一个脚本可以从元素的主列表中删除 "bad elements",然后 returns 一个包含更新元素及其关联值的 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 阶段正确使用Pandas
...
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 删除杂乱的迭代格式化操作
我们可以添加一个包含格式化数据的列 ('Formatted')。为此,我们将创建一个 lambda function:
formatter = lambda row: '\n%s,%.25f'%(row['elem'], row['Max_Principal_Strain'])
Master['Formatted'] = Master.apply(formatter)
阶段 4Pandas-路过滤和输出
我们可以通过两种方式格式化数据框。我的偏好是重用格式化功能:
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)