Как перебрать столбцы с оператором управления? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть следующий код прямо сейчас:

import pandas as pd


df_area=pd.DataFrame({"area":["Coesfeld","Recklinghausen"],"factor":[2,5]})
df_timeseries=pd.DataFrame({"Coesfeld":[1000,2000,3000,4000],"Recklinghausen":[2000,5000,6000,7000]})

columns_in_timeseries=list(df_timeseries)
columns_to_iterate=columns_in_timeseries[0:]

newlist=[]

for i,k in enumerate(columns_to_iterate):
    new=df_area.loc[i,"factor"]*df_timeseries[k]
    newlist.append(new)

newframe=pd.DataFrame(newlist)
df1_transposed = newframe.T

Код умножает каждый фактор из области на ряды времени из этой области. В этом примере код выполняет итерацию сразу строк и столбцов после умножения. На следующем шаге я хочу расширить df_area -Датафрейм следующим образом:

df_area=pd.DataFrame({"area":["Coesfeld","Coesfeld","Recklinghausen","Recklinghausen"],"factor":[2,3,5,6]})

Как видите, у меня разные факторы для одной и той же области. Цель состоит в том, чтобы итерировать столбцы в df_timeseries только при изменении области в df_area. Мое первое намерение - использовать if-Statement, но сейчас я понятия не имею, как реализовать это с помощью цикла for.

1 Ответ

1 голос
/ 14 октября 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...