Как добавить фрейм данных в пустой фрейм данных с помощью одновременного - PullRequest
1 голос
/ 19 июня 2019

Я хочу запустить функцию, используя concurrent в Python.Это функция, которая у меня есть:

import concurrent.futures
import pandas as pd
import time

def putIndf(file):
    listSel = getline(file)
    datFram = savetoDataFrame(listSel)
    return datFram #datatype : dataframe

def main():
    newData = pd.DataFrame()
    with concurrent.futures.ProcessPoolExecutor(max_workers=30) as executor:
        for i,file in zip(fileList, executor.map(dp.putIndf, fileList)):
            df = newData.append(file, ignore_index=True)
    return df

if __name__ == '__main__':
    main()

Я хочу объединить фрейм данных в один фрейм данных newData, но результат - только последний фрейм данных из этой функции

1 Ответ

1 голос
/ 19 июня 2019

По существу, вы переопределяете df с каждой итерацией и никогда не увеличиваете ее.Что вы, вероятно, имели в виду (опрометчиво), так это инициализировать пустой df и добавлять итеративно:

df = pd.DataFrame()
...
df = df.append(file, ignore_index=True)

Тем не менее, предпочтительным методом является создание набора фреймов данных для добавлениявсе вместе один раз вне цикла и избегайте роста любых сложных объектов, таких как фреймы данных внутри цикла.

def main():
    with concurrent.futures.ProcessPoolExecutor(max_workers=30) as executor:
        # LIST COMPREHENSION
        df_list = [file for i,file in zip(fileList, executor.map(dp.putIndf, fileList))]

        # DICTIONARY COMPREHENSION
        # df_dict = {i:file for i,file in zip(fileList, executor.map(dp.putIndf, fileList))}

    df = pd.concat(df_list, ignore_index=True)
    return df

В качестве альтернативы из-за процесса пула добавьте фреймы данных в список, по-прежнему объединяя один развне цикла:

def main():
    df_list = []      # df_dict = {}
    with concurrent.futures.ProcessPoolExecutor(max_workers=30) as executor:
        for i,file in zip(fileList, executor.map(dp.putIndf, fileList)):
            df_list.append(file)
            # df_dict[i] = file

    df = pd.concat(df_list, ignore_index=True)
    return df
...