У меня есть фрейм данных, который содержит несколько идентификаторов. Я хочу создать один новый «идентификатор группы» для каждой уникальной комбинации идентификаторов. Позже я хочу запустить регрессии с помощью statsmodels
. То есть, скажем, у меня естьСоздать идентификаторы групп для регрессий
id1 id2 id3
A 1 100
A 1 101
B 1 100
B 1 100
Я хочу, чтобы получить
id1 id2 id3 groupid
A 1 100 0
A 1 101 1
B 1 100 2
B 1 100 2
с id1
, id2
, id3
как набор идентификаторов. Я знаю, что могу получить unique()
, чтобы получить уникальные группы, но как бы я мог эффективно кодировать строки, в какие из уникальных групп они принадлежат?
Скорректированная @ ответ Берни, чтобы приспособить для потенциальных «Нэн:
# get a DataFrame with just the unique "keys"
df2 = df.replace(np.NaN, -1)
g = df2.groupby([u'id1',u'id2',u'id3'])
gdf = pd.DataFrame(g.groups.keys(),columns=df.columns)
gdf = gdf.replace(-1, np.NaN)
# an idea is to re-use the index as the 'group_id'
# the next three commands support that
gdf.sort([u'id1',u'id2',u'id3'],inplace=True)
gdf.reset_index(drop=True,inplace=True)
gdf['group_id'] = gdf.index
# merge on the three id columns
mdf = df.merge(gdf,how='inner',on=df.columns.tolist())
Я предпочитаю этот ответ, потому что я могу передать список столбцов - тоже, я бы ожидать, что это будет более эффективным , – FooBar
Вы должны заменить первую строку следующим: 'df2 = df.replace (np.NaN, -1)', 'g = df2.groupby (...)'. «groupby» не работает («как ожидается здесь») с «NaN» и создаст отдельную группу для каждого значения «NaN». – FooBar
Спасибо, @FooBar. Я обновил ответ. Сбрасывает ли NaN смысл для ваших целей? – bernie