Возврат нескольких строк для каждой строки в DataFrame в Pandas - PullRequest
0 голосов
/ 30 апреля 2020

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

вот пример:

df = pd.DataFrame({'ID':[1,2],
                    'Month':[1,1],
                   'Plan':[310,620],
                'Month_start_date': ['2020-01-01','2020-01-01']})
print(df)

df['Month_start_date'] = (pd.to_datetime(df['Month_start_date'], format='%Y/%m/%d')
                     .dt.to_period('m').dt.to_timestamp())

df = df.set_index('Month_start_date')

Теперь функция, которую я хочу применить к каждой строке, возвращает большее количество строк, вот пример:

start = '2020-01-01'
end = '2020-01-05'
dates = pd.date_range(start, end, freq='D')
dates

df= df.reindex(dates,method = 'ffill')

Это возвращает ошибку, так как у индекса есть повторяющиеся значения

ValueError: cannot reindex a non-unique index with a method or limit

Вот мой желаемый вывод

            ID  Month  Plan
2020-01-01   1      1   310
2020-01-02   1      1   310
2020-01-03   1      1   310
2020-01-04   1      1   310
2020-01-05   1      1   310
2020-01-01   2      1   620
2020-01-02   2      1   620
2020-01-03   2      1   620
2020-01-04   2      1   620
2020-01-05   2      1   620

Поскольку число комбинаций, для которых я должен выполнить это, составляет около 800 КБ, на самом деле он выполняется. на циклах (использование .iterrows ()) завершается вечно и кажется очень неэффективным.

Также попытался использовать функцию .groupby.apply (). но это не позволяет мне возвращать фрейм данных для каждой строки (таблица df).

Предложения, необходимые для улучшения этого процесса.

1 Ответ

0 голосов
/ 30 апреля 2020

Функция sort_values ​​(), как мы надеемся, должна достичь того, что вы ищете:

df.sort_values(by=df.index, inplace =True)

Или, если у ваших дат есть имя столбца, вы просто измените его на df's имя столбца, и вы можете даже связать его с groupby, чтобы создать кадры данных только для определенных отсортированных групп, так как ваш набор данных очень большой. Надеюсь, это немного поможет!

...