У меня есть несколько фреймов данных, где данные помечены в группах, скажем, так:
df1 = pd.DataFrame({'id':[1,3,7, 10,30, 70, 100, 300], 'name':[1,1,1,1,1,1,1,1], 'tag': [1,1,1, 2,2,2, 3,3]})
df2 = pd.DataFrame({'id':[2,5,6, 20, 50, 200, 500, 600], 'name': [2,2,2,2,2,2,2,2], 'tag':[1,1,1, 2, 2, 3,3,3]})
df3 = pd.DataFrame({'id':[4, 8, 9, 40, 400, 800, 900], 'name': [3,3,3,3,3,3,3], 'tag':[1,1,1, 2, 3, 3,3]})
В каждом фрейме данных тег присваивается в порядке возрастания идентификаторов (поэтому большие идентификаторы будут равны илибольшие метки).Я хочу пересчитать теги в объединенном фрейме данных,
df = pd.concat([df1, df2, df3])
, чтобы тег каждой группы был в порядке возрастания идентификаторов первого элемента каждого.Таким образом, группа, начинающаяся с id = 1, будет помечена 1 (то есть идентификаторы 1,3,7), группа, начинающаяся с id = 2, будет помечена 2 (то есть идентификаторы 2,5,6),группа, начинающаяся с 4, будет помечена как 3, группа, начинающаяся с 10, будет помечена как 4 и т. д.
Мне удалось получить (сложное!) решение:
1) Получить первую строку каждой группы, поместить их в кадр данных, отсортировать по id и создать новые теги:
dff = pd.concat([df1.groupby('tag').first(), df2.groupby('tag').first(), df3.groupby('tag').first()])
dff = dff.sort(['id'])
dff = dff.reset_index()
dff['new_tags'] = dff.index +1
2) Объединить этот кадр данных с начальными, drop_duplicates, чтобы сохранить новые тегистроки, упорядоченные по группам, затем распространяют новые теги:
df = pd.concat([dff, df1, df2, df3])
df = df.drop_duplicates(subset=['id', 'tag', 'name'])
df = df.sort(['name', 'tag'])
df = df.fillna(method = 'pad')
Новые теги - это именно то, что нужно, но мое решение кажется слишком сложным.Не могли бы вы предложить, как сделать проще?Я думаю, что я что-то упускаю!
Заранее спасибо,
М.