vit*_*Cho 2 python export-to-csv pandas
我有一个相当大的熊猫数据框,我想根据条件选择一些行。
问题在于,另存为 CSV 的操作与程序的整体流程是分开的,并且会消耗相当多的时间。
是否可以分离线程,以便主线程前进到选定的行,同时将未选定的行保存为另一个线程中的 csv?
例如...
# This is pseudo code
import pandas as pd
df = pd.DataFrame({"col1":[x for x in range(10000)], "col2":[x**2 for x in range(0, 10000)]})
df_selected = df[df.apply(lambda x: x.col1%3==0, axis=1)]
df_unselected = df[df.apply(lambda x: x.col1%3!=0, axis=1)]
def Other_thread_save_to_csv(df:pd.DataFrame):
# this function is the last function to use df_unselected .
Other_thread_save_to_csv(df_unselected )
all_other_hadlings(df_selected )
Run Code Online (Sandbox Code Playgroud)
是的,Python 的线程或多处理功能对于并发任务(例如在执行其他任务时将 DataFrame 保存到 CSV)非常方便。
在 python 中使用线程和多处理时需要考虑一些事情:
Python 中的全局解释器锁 (GIL):这意味着线程可能并不总是能加速 CPU 密集型任务。但对于 I/O 任务(比如文件写入)来说,它还是很好用的。
对繁重的 CPU 任务使用多重处理:如果您的其他 DataFrame 任务是 CPU 密集型任务,则多重处理是比线程更好的选择。
最后一个是线程安全,当您将 DataFrame 写入 CSV 时,您必须确保没有其他线程正在更改 DataFrame。
# This is pseudo code
import pandas as pd
import threading
def save_to_csv(df, filename):
df.to_csv(filename, index=False)
df = pd.DataFrame({"col1": [x for x in range(10000)], "col2": [x**2 for x in range(10000)]})
df_selected = df[df["col1"] % 3 == 0]
df_unselected = df[df["col1"] % 3 != 0]
# Initiating a thread to save a portion of DataFrame
thread = threading.Thread(target=save_to_csv, args=(df_unselected, 'unselected_rows.csv'))
thread.start()
# Continue other tasks with the main thread
# additional_operations(df_selected)
# Optionally, wait for the thread to complete
thread.join()
Run Code Online (Sandbox Code Playgroud)
save_to_csv函数在单独的线程上运行,允许您的程序在后台保存的df_selected同时进行处理。df_unselected