#python #pandas
#python #pandas
Вопрос:
Как выполнить повторную выборку индекса даты с месяцем и сгруппировать по одному столбцу и агрегированному среднему значению другого столбца.
Пример фрейма данных:
bts_name duration
cleareddate
2019-01-19 1002_NUc_Marathalli 95
2019-01-21 1002_NUc_Marathalli 188
2019-02-11 1002_NUc_Marathalli 1332
2019-04-12 1002_NUc_Marathalli 940
2019-01-11 1003_IU2_Munnekolalu 73
Я пытаюсь с частотой месяца и группировать по bts_name
и sum
продолжительности каждого месяца.
Комментарии:
1. Можете ли вы уточнить «повторную выборку индекса даты с месяцем»? Вы хотите случайным образом выбирать один элемент в месяц из всех элементов в этом месяце? Или вы хотите сгруппировать как месяц, так и
bts_name
? Это может помочь предоставить ожидаемый результат с вашим вопросом.2. выходные данные должны быть сгруппированы по bts_name и месяцу (в cleareddate) и суммировать продолжительность с использованием повторной выборки
3. Опять же, ваше использование «повторной выборки» неясно. Повторная выборка обычно относится к технике в стиле bootstrap, но тогда агрегат «сумма» не имеет особого смысла. Я отправлю ответ, но просто прокомментирую, если это не то, что вы ищете.
4. можете ли вы показать нам, как должен выглядеть выходной df? Спасибо
5. ник, я хочу знать, где можно использовать метод передискретизации, чтобы получить желаемый результат
Ответ №1:
Вы можете reset_index
установить cleareddate
поле в качестве столбца в вашем фрейме данных. Я бы создал новый столбец с месяцем, а затем вы можете выполнить это прямо groupby
.
df.reset_index(inplace=True)
df['month'] = df.cleareddate.dt.month
df.groupby(['month','bts_name']).agg('sum').duration
Примечания:
- Я предположил, что индекс имеет тип datetime. Если это не так, добавьте
df.cleareddate = pd.to_datetime(df.cleareddate)
строку заreset_index
строкой. - Обратите внимание, что месяцы за два разных года будут сгруппированы как одинаковые. Вам также нужно группировать по годам? Если это так, добавьте еще один столбец для года и добавьте этот термин в свой столбец groupby
РЕДАКТИРОВАТЬ: после обсуждения в комментариях с @sriman я включил другой способ достижения вышеуказанного с помощью метода повторной выборки pandas.
# your data
df = pd.DataFrame({
'bts_name': ['1002_NUc_Marathalli','1002_NUc_Marathalli',
'1002_NUc_Marathalli','1002_NUc_Marathalli',
'1003_IU2_Munnekolalu'],
'duration': [95,188,1332,940,73]
}, index=pd.to_datetime(['2019-01-19','2019-01-21',
'2019-02-11','2019-04-12','2019-01-11']))
# solution
def resample(group):
return group.resample('M').sum()
result = df.groupby('bts_name').apply(resample)
# result
print(result)
duration
bts_name
1002_NUc_Marathalli 2019-01-31 283
2019-02-28 1332
2019-03-31 0
2019-04-30 940
1003_IU2_Munnekolalu 2019-01-31 73
Комментарии:
1. Спасибо, это сработает, есть ли какой-нибудь способ сделать это с помощью метода повторной выборки
2. Ах, я думаю, я понимаю, о чем вы говорите. Вы хотели бы использовать этот метод здесь: pandas.pydata.org/pandas-docs/stable/reference/api /… ? Я уверен, что смогу что-то добавить к приведенному выше решению, если это так.
3. Дайте мне знать, если редактирование — это то, что вы имели в виду? Вы всегда можете ‘reset_index ()’, чтобы получить поля bts_name и date из индекса и обратно в столбцы.
4. с вашей помощью мне понравился этот df1.groupby(‘bts_name’).resample(‘M’).sum(), он работает, но требуется некоторое время для почти 1,2 тысяч записей