pandas - 如何优化代码,同时导出为 csv?
问题描述
我正在尝试根据某些规则导出到 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')
编辑1:答案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
几秒钟。任何更大的东西,我都会遇到内存错误。如果你需要更大,你可能需要研究 Dask。
编辑2:答案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 似乎是最有效的,无论如何都有这个大小的数据。
推荐阅读
- php - 发送包含与收件人相关内容的 laravel 邮件
- sql - 最常用的日期查询
- javascript - 带有 CLICK 事件侦听器的 Javascript API FETCH:TypeError:尝试获取资源时出现 NetworkError
- datepicker - jQuery Datepicker - 如何设置:datepicker1 + 1 天变为 minDate datepicker2 并可选择关闭周六和周日
- python - 尽管为给定列提供“非空”条件,但我似乎可以在表中输入空值
- android - 找不到符号导入 io.flutter.FlutterInjector
- php - 在 postgresql 中存储在数据类型为 double 的列中时,减法结果不准确
- string - 将格式错误的字符串转换为 Scala 类
- r - 如何在使用 MICE 进行多重插补后进行描述性统计(中位数、IQR、频率、比例等)
- python - 如何按位置搜索 Instagram 帖子