#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. ваши решения выглядят хорошо, большое спасибо! Однако моя интуиция подсказывает мне, что там может быть решение без неэффективного цикла.