【发布时间】:2020-02-10 11:36:48
【问题描述】:
我知道如何使用字典中的相关键和值来更新数据框的列,但是更新列中多个组的值的最佳方法是什么 来自字典?
因此,一种方法是执行 groupby,然后从字典中的相应键读取组值。但是,对于我的数据集来说,这需要很长时间,它有 14M 行和 125000 个“match_id”。
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”,其中的值是从每个 match_id 的 dict1 中提取的。
我也尝试了 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']]
【问题讨论】:
-
你创建的字典的逻辑是什么?你能解释一下而不是只显示代码吗?
-
这是我代码的另一部分,但可以为这部分丢弃
标签: python pandas dataframe dictionary pandas-groupby