#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]
Надеюсь, это поможет!