У меня есть пандас DataFrame, сгенерированный этим фрагментом:
elig = pd.DataFrame({'memberid': [1,1,1,1,1,1,2],
'monthid': [201711, 201712, 201801, 201805, 201806, 201807, 201810]})
, и я хотел бы выполнить операцию .groupby
над memberid
на основе непрерывных значений monthid
, например,Мне бы хотелось, чтобы (очень) конечным результатом была таблица, похожая на эту:
memberid | start_month | end_month
1 | 201711 | 201801
1 | 201805 | 201807
2 | 201810 | 201810
Мне было интересно, есть ли идиоматический способ Панд для этого.До сих пор я пробовал запутанный метод, определяющий new_elig = defaultdict(list)
, а затем внешнюю функцию:
def f(x):
global new_elig
new_elig[x.iloc[0]['memberid']].append(x.iloc[0]['monthid'])
и, наконец,
elig.groupby('memberid')[['memberid', 'monthid']].apply(f)
, который занимает около 5 минут для строк ~ 700k висходный DataFrame для создания new_elig
, который затем я должен вручную проверять для каждого memberid
, чтобы получить непрерывные диапазоны.
Есть ли лучший способ?Там должно быть одно: /