Выполните все функции в словаре и преобразуйте в фрейм данных

#python

Вопрос:

У меня есть словарь python, в котором хранятся такие функции:

 def a_func():  return "aa" def b_func():  return "bb" def c_func():  return "cc"  func_dict = {  "a":a_func,  "b":b_func,  "c":c_func }  

Как я могу эффективно выполнять эти функции, чтобы я мог создать из них фрейм данных, подобный этому: (Я предполагаю, что цикл неэффективен, итоговая таблица может содержать миллионы значений)

 pd.DataFrame( {'a': ["aa", "aa","aa"], 'b': ["bb", "bb", "bb"], "c": ["cc","cc","cc"]})  a b c 0 aa bb cc 1 aa bb cc 2 aa bb cc  

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

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

 df_dict = {} for i in range(3):  for item in func_dict:  if i == 0:  df_dict[item] = [func_dict[item]()]  else:  df_dict[item].append(func_dict[item]())  {'a': ['aa', 'aa', 'aa'], 'b': ['bb', 'bb', 'bb'], 'c': ['cc', 'cc', 'cc']}  

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

1. Что вы пробовали до сих пор? Нам нужно больше деталей. Потому что неясно, что на самом деле делают ваши функции и как они связаны с вашим вопросом, поскольку они просто возвращают константы. И зачем вам нужны миллионы одинаковых строк?

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

3. Если вы хотите вызывать каждую функцию несколько раз, вам понадобится цикл. Например, для 1000 строк вы можете использовать df = pd.DataFrame({"a": [a_func() for _ in range(1000)], "b": [b_func() for _ in range(1000)], "c": [a_func() for _ in range(1000)]})

4. это решение было бы хорошим, но функции будут разными. Поэтому в следующем словаре могут быть только a_func и b_func, я добавлю это требование в описание

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

Ответ №1:

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

 rows_to_create = 3 df_dict = {} for k, v in func_dict.items():  df_dict[k] = [v() for _ in range(rows_to_create)]  

Быстрое сравнение того, что у вас есть, с приведенным выше кодом, создающим 100 000 000 строк данных с использованием предоставленных функций.

Ваш текущий код: ~68 секунд
Код выше: ~24 секунды

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

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