Pandas 如何在导出到csv时优化代码?
我正在尝试根据某些规则导出到csv文件。导出到csv时需要更多时间。有人能建议如何优化代码吗 代码段:Pandas 如何在导出到csv时优化代码?,pandas,Pandas,我正在尝试根据某些规则导出到csv文件。导出到csv时需要更多时间。有人能建议如何优化代码吗 代码段: readCsv = pd.read_csv(inputFile) readCsv.head() readCsv.columns readCsv[(readCsv[attributeKey.title()].str.casefold()).str.contains(str.lower(Key))==True] .to_excel(r"C:\\User\\Deskto
readCsv = pd.read_csv(inputFile)
readCsv.head()
readCsv.columns
readCsv[(readCsv[attributeKey.title()].str.casefold()).str.contains(str.lower(Key))==True]
.to_excel(r"C:\\User\\Desktop\\resultSet.xlsx", index = None, header=True)
像这样的
import pandas as pd
import time
df = pd.DataFrame({'Column1': pd.util.testing.rands_array(10, 10000000)})
attributeKey = 'column1'
Key = 'abc' #the string you are checking for
start = time.time()
df[df[attributeKey.title()].str.lower().str.contains((Key).lower())]
end = time.time()
print(end - start)
df.to_excel('output.xlsx')
Edit1:答案2
import pandas as pd
import time
df = pd.DataFrame({'Column1': pd.util.testing.rands_array(10, 10000000)})
attributeKey = 'column1'
Key = 'abc' #the string you are checking for
start = time.time()
df[df[attributeKey.title()].str.lower().str.contains((Key).lower())]
end = time.time()
print(end - start)
df.to_excel('output.xlsx')
10.000.000行需要6.47
秒。再大一点的话,我就会出现内存错误。如果你需要更大的,你可能需要调查达斯克
Edit2:答案3
更改为应用可将时间缩短约一半
import pandas as pd
import time
def check_key(s):
return KEY.lower() in s.lower()
df = pd.DataFrame({'Column1': pd.util.testing.rands_array(10, 10000000)})
KEY = 'abc' #the string you are checking for
ATTRIBUTE_KEY = 'column1'
start = time.time()
df[df[ATTRIBUTE_KEY.title()].apply(check_key)]
end = time.time()
print(end - start)
输出:3.3952105045318604
秒
编辑3:答案4
只是为了好玩,尝试使用多处理:
from multiprocessing import Pool
from functools import partial
import numpy as np
def parallelize(data, func, num_of_processes=8):
data_split = np.array_split(data, num_of_processes)
pool = Pool(num_of_processes)
data = pd.concat(pool.map(func, data_split))
pool.close()
pool.join()
return data
def run_on_subset(func, data_subset):
return data_subset.apply(func)
def parallelize_on_rows(data, func, num_of_processes=8):
return parallelize(data, partial(run_on_subset, func), num_of_processes)
def check_key(s):
return KEY.lower() in s.lower()
df = pd.DataFrame({'Column1': pd.util.testing.rands_array(10, 10000000)})
KEY = 'abc' #the string you are checking for
ATTRIBUTE_KEY = 'column1'
start = time.time()
parallelize_on_rows(df[ATTRIBUTE_KEY.title()], check_key)
end = time.time()
print(end - start)
输出
6.306780815124512
,因此答案3似乎是最有效的,不管怎么说,使用这种大小的数据。欢迎使用so。请编辑您的问题并将最后一行的格式设置好好吗?目前它几乎不可读。是的,它适用于小型数据集。对于大型数据集,这将需要更多的时间,因此如何对此进行优化?没有问题@sharath。如果您喜欢答案,请花点时间勾选以接受,谢谢:-)