быстрое сохранение результатов цикла Python

#python #python-3.x #loops #pandas

#python #python-3.x #циклы #pandas

Вопрос:

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

 data =[{'a':1,'b':2,'c':3},{'a':1,'b':2,'c':3}, {'a':1,'b':2,'c':3}]
InputData = pd.DataFrame(data)

ResultData = pd.DataFrame(columns = ['a', 'b', 'c'])

def SomeFunction(row):
    #Function code goes here (not important to this question)#
    ##########################################################
    ##########################################################
    return Temp 


for index, row in InputData.iterrows():
    # Temp will equal the result of the function (a DataFrame with 3 columns and 1 Row)
    Temp = Somefunction(row)

    # If ResultData is not empty append Temp to ResultData
    if len(ResultData) != 0:
        ResultData = ResultData.append(Temp, ignore_index = True)
    # If ResultData is empty Result data = Temp
    else:
        ResultData = Temp
  

Я надеюсь, что моему примеру легко следовать.

В моем реальном примере у меня около миллиона строк во входных данных, и этот процесс очень медленный, и я думаю, что добавление фрейма данных делает его таким медленным. Возможно, я мог бы использовать другую структуру данных, которая могла бы хранить три значения фрейма данных «Temp», которые можно было бы добавить в конце для формирования фрейма данных «resultData»?

Любая помощь была бы высоко оценена

Комментарии:

1. То, что делает ваша функция, очень важно для этого вопроса. Это практически единственное, что имеет значение.

2. df.iterrows() возвращайте серию, которая немного медленная, вам действительно нужна серия в SomeFunction ?

3. @StevenG — Что мне нужно, так это каждое значение каждой строки. то есть в этом примере мне нужно 1,2,3. Я думаю, это не обязательно должна быть серия, это может быть список или какая-либо другая структура данных.

4. затем используйте df.itertuples() и измените свой SomeFunction . используйте список для сохранения вашего результата, как сказал anonymous ниже

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

Ответ №1:

Лучше избегать любых явных циклов в pandas. Использование apply все еще немного медленно, но, вероятно, быстрее, чем цикл.

 df["newcol"] = df.apply(function, axis=1)
  

Ответ №2:

Возможно, список списков решит вашу проблему:

 Result_list = []

for ... :
  ...
  Result_list.append([data1, data2, data3]);
  

Для просмотра данных:

 for Current_data in Result_list:
   data1 = Current_data[0]
   data2 = Current_data[1]
   data3 = Current_data[2]
  

Надеюсь, это поможет!