以pandas df的形式同时进行多处理查询,然后将df合并为Single df

时间:2019-08-19 11:20:54

标签: python multiprocessing

我想总结许多表记录的数量,并且希望它并行运行以节省时间

[[]]

可能是这样

list_tabl_cn =['TBL_A', 'TBL_B', 'TBL_C', 'TBL_D']

def tblRowCn(p_tbl):
    #connDb = pyodbc.connect(f'DSN={nama_db_target}', autocommit =True)
    connDb = sqlanydb.connect(uid='dba', 
                               pwd='sql',
                               host='ip:port', 
                               dbn='blah')    
    is_tableExists = ego.my_desc(p_tbl,163).shape[0] 
    if is_tableExists:
        proc_name = 'df_'+p_tbl
        if p_tbl == 'STG_CFG_SYS':
            Q_ = """\
              SELECT OPENDATE as TGL_POS, COUNT(1) CN FROM {0}
              GROUP BY TGL_POS
            """.format(p_tbl)
        else:
            Q_ = """\
              SELECT TANGGAL_POSISI as TGL_POS, COUNT(1) CN FROM {0}
              GROUP BY TGL_POS
            """.format(p_tbl)
        df_tbl = pd.read_sql_query(Q_, connDb, parse_dates=['TGL_POS'])
        df_tbl['THN'],df_tbl['BLN']= df_tbl['TGL_POS'].dt.year, df_tbl['TGL_POS'].dt.month    
    else:
        df_tbl=[]

    return df_tbl

def task(table_nm):
    print(f"Task Executed with process {mp.current_process().pid}")
    tblRowCn(table_nm.upper())

def main():
    executor = mp.Pool(mp.cpu_count()-8)
    executor.map(task, [n_table_nm for n_table_nm in list_tabl_cn])
    executor.close()

if __name__ == "__main__":
    main()  

我的整个数据帧是def main(): executor = mp.Pool(mp.cpu_count()-8) executor.map(task, [n_table_nm for n_table_nm in list_tabl_cn]) append.[task1, task2, task...] executor.close()

我相信我错过了代码中的某些内容,但是太模糊了。

1 个答案:

答案 0 :(得分:0)

如果您所有的Dataframes具有相同的列,并且您希望将所有数据帧的所有行都添加到一个dataframe中,则可以使用熊猫concat函数。将所有单独的数据框添加到列表中,然后合并所有这些框以创建主数据框。

list_of_df =[] 
for df in executor.map(task, list_tabl_cn):
    if df:
        list_of_df.append(df)
main_df = pd.concat(list_of_df)

您可以在tblRowCn方法中删除else条件,它是多余的,不需要。

在您的代码中,您从list_tabl_cn生成了一个列表以将其传递给map函数,而不必这样做,您可以像上述代码中那样直接给list_tabl_cn映射函数。