我有600个csv文件,每个文件包含大约1500行数据。我必须对每一行数据运行一个函数。我已经定义了函数。
def query_prepare(data):
"""function goes here"""
"""here input data is list of single row of dataframe""" 上述函数基于条件执行某些功能,如strip()、replace()。上面的函数将每一行数据作为列表。
data = ['apple$*7','orange ','bananna','-']。
这是我的初始数据帧外观
a b c d
0 apple$*7 orange bananna -
1 apple()*7 flower] *bananna -我用函数检查了0.04s需要处理的一行数据。如果我在一个包含1500行数据的csv文件上运行它,它几乎需要1500*0.04s。我已经尝试了一些方法……
# normal in built apply function
t = time.time()
a = df.apply(lambda x: query_prepare(x.to_list()),axis=1)
print('time taken',time.time()-t)
# time taken 52.519816637039185
# with swifter
t = time.time()
a = df.swifter.allow_dask_on_strings().apply(lambda x: query_prepare(x.to_list()),axis=1)
print('time taken',time.time()-t)
# time taken 160.31028127670288
# with pandarallel
pandarallel.initialize()
t = time.time()
a = df.parallel_apply(lambda x: query_prepare(x.to_list()),axis=1)
print('time taken',time.time()-t)
# time taken 55.000578我用我的query_prepare函数做了所有的事情来减少时间,所以没有办法改变或修改它。还有其他的建议吗?
顺便说一下,我在google colab上运行它
编辑:如果我们有1500行数据,将其分成15行,然后应用函数。如果我们这样做,我们能把时间减少15倍吗?(很抱歉,我不确定这是不是可能,或者没有以一种好的方式指导我)
发布于 2020-11-11 15:05:20
例如,您可以大致执行以下操作:
def sanitize_column(s: pd.Series):
return s.str.strip().str.strip('1234567890()*[]')然后你可以这样做:
df.apply(sanitize_column, axis=0)通过以下方式:
df = pd.DataFrame({'a': ['apple7', 'apple()*7'], 'b': [" asd ", ']asds89']})这将给出
a b
0 apple asd
1 apple asds这应该比你的解决方案更快。为了进行适当的基准测试,我们需要您的完整解决方案。
https://stackoverflow.com/questions/64781465
复制相似问题