Я не могу избавиться от подозрения, что во всем вашем подходе что-то не так. Первый красный флаг - это использование вами широкого формата вместо длинного - по моему опыту, это, вероятно, вызовет у вас ненужные проблемы.
Как бы то ни было, вот функция, которая принимает фрейм данных с данными временного ряда и второй фрейм данных со значениями множителя и именами областей в качестве аргументов. Два фрейма данных используют ту же структуру, что и ваши примеры df_timeseries
(имена областей в виде столбцов, значения временных рядов в качестве значений ячеек) и df_area
(имена областей в качестве значений в столбце area
, множитель в качестве значения в столбце factor
). Я почти уверен, что это не очень хороший способ упорядочить ваши данные, но решать вам.
Функция выполняет итерацию по строкам второго фрейма данных (df_area
-любить). Он использует значение area
, чтобы выбрать правильный ряд из первого кадра данных (df_timeseries
-подобный), и умножает этот ряд на значение factor
из этой строки. Результат добавляется как элемент в генератор списков.
def do_magic(df1, df2):
return [df1[area] * factor for area, factor in zip(df2.area, df2.factor)]
Вы можете вставить это прямо в ваш код, чтобы заменить ваш цикл:
df_area = pd.DataFrame({"area": ["Coesfeld", "Recklinghausen"],
"factor": [2, 5]})
df_timeseries = pd.DataFrame({"Coesfeld": [1000, 2000, 3000, 4000],
"Recklinghausen": [2000, 5000, 6000, 7000]})
newlist = do_magic(df_timeseries, df_area)
newframe = pd.DataFrame(newlist)
df1_transposed = newframe.T
Это также работает с вашим расширенным df_area
. Результирующий список будет состоять из четырех серий (две для Coesfeld
, две для Recklinghausen
).