Я знаю, как обновить столбец данных, используя соответствующие ключи и значения из словаря, но как лучше всего обновить значения нескольких групп в столбце изсловарь?
Итак, один из способов сделать это - сгруппировать, а затем прочитать значения группы из соответствующих ключей в словаре. Однако это занимает слишком много времени для моего набора данных, который имеет 14M строк и 125000 'match_id's.
df = pd.DataFrame({'match_id': ['m1', 'm1', 'm1', 'm1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm2', 'm2', 'm2', 'm3', 'm3', 'm3', 'm3'],
'name':['peter', 'mike', 'jeff', 'john', 'alex', 'joe', 'jeff', 'peter', 'alex', 'li', 'joe', 'tom', 'mike', 'john', 'tom', 'peter'],
'rank': [4, 3, 1, 2, 5, 6, 2, 4, 3, 1, 5, 6, 1, 3, 2, 4],
'rating': [1200, 1300, 1600, 1550, 1150, 1540, 1340, 1300, 1390, 1290, 1450, 1650, 1420, 1490, 1320, 1410]})
dict1 = {'m1': [5, 4, 1, 2, 6, 3], 'm2': [4, 5, 3, 6, 2, 1], 'm3': [2, 1, 4, 3]}
df_new = pd.DataFrame()
grouped = df.groupby('match_id', sort=False)
for id, dfg in grouped:
dfm = dfg.copy()
dfm['new_rank']= dict1[id]
df_new = pd.concat([df_new, dfm], sort=True)
Это создает новый столбец' new_rank ', в котором значения извлекаются из dict1 для каждого match_id.
Я также попробовал функцию map , но поскольку она не предназначена для групп, она просто вставляет полный список значений для каждого match_id в каждую строку.
Есть ли какой-нибудь эффективный способ сделать это?
Кстати, я пришел к словарю, который вычисляет новые ранги на основе порядка чисел в столбце «рейтинг» (если выможет также придумать лучший способ приблизиться ко всему, пожалуйста, дайте мне знать):
dict1 = {}
grouped = df.groupby('match_id', sort=False)
for id, dfg in grouped:
dfm = dfg.copy()
dict1[id] = [len(dfm['rating'])-(sorted(dfm['rating'], reverse = False).index(x)) for x in dfm['rating']]