Каков самый быстрый способ создать один многоуровневый фрейм данных pandas, состоящий из нескольких фреймов данных?

#python #pandas #multi-index

#питон #панды #многоиндексный

Вопрос:

В основном я делаю следующее, и я думаю, что, вероятно, есть более быстрый способ, чем выполнение pd.concat и df.append в каждом цикле?

 final_df = pd.DataFrame() for (key, data, date) in data_tuples:  df = pd.DataFrame(data, columns=['Price', 'Quantity'])  timestamp = datetime.strptime(date, '%a, %d %b %Y %H:%M:%S GMT')  df = pd.concat([df], axis=0, keys=[timestamp])  df = pd.concat([df], axis=0, keys=[key])  final_df = final_df.append(df)  final_df.index = final_df.index.rename(['symbol', 'time', 'row']) final_df['Price'] = final_df['Price'].apply(float) final_df['Quantity'] = final_df['Quantity'].apply(float)  

Ответ №1:

чтобы избежать добавления и объединения на каждом шаге, вы могли бы:

  1. создайте итератор из ваших данных кортежей
  2. примените метод на итераторе для анализа фрейма данных и приведения его к требуемому формату
  3. примените pd.concat один раз в списке кадров данных.

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

 import pandas as pd from datetime import datetime    data_tuples = (("1", {"Price": [1,2], "Quantity":[1,2]}, "20:20:20"), ("1", {"Price": [3,4], "Quantity":[3,4]}, "20:20:30"))   def parse_values(data, date):  df = pd.DataFrame(data, columns=['Price', 'Quantity'])  df["date"] = date  return df   df = pd.concat([parse_values(data,date) for _,data,date in data_tuples])  

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

1. Это сильно ускорило процесс… примерно от 3,5 секунд до 0,65 секунды! Спасибо