Pandas 如何在导出到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

我正在尝试根据某些规则导出到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\\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。如果您喜欢答案,请花点时间勾选以接受,谢谢:-)