Python 从字典更新列中组的值
我知道如何使用字典中的相关键和值更新数据框的列,但从字典更新列中多个组的值的最佳方法是什么 因此,一种方法是执行groupby,然后从字典中相应的键中读取组值。但是,这对于我的数据集来说太长了,它有1400万行和125000个“匹配id”Python 从字典更新列中组的值,python,pandas,dataframe,dictionary,pandas-groupby,Python,Pandas,Dataframe,Dictionary,Pandas Groupby,我知道如何使用字典中的相关键和值更新数据框的列,但从字典更新列中多个组的值的最佳方法是什么 因此,一种方法是执行groupby,然后从字典中相应的键中读取组值。但是,这对于我的数据集来说太长了,它有1400万行和125000个“匹配id” df=pd.数据帧({'match_id':['m1','m1','m1','m1','m2','m2','m2','m2','m2','m2','m2','m3','m3'], “姓名”:[“彼得”、“迈克”、“杰夫”、“约翰”、“亚历克斯”、“乔”、“杰
df=pd.数据帧({'match_id':['m1','m1','m1','m1','m2','m2','m2','m2','m2','m2','m2','m3','m3'],
“姓名”:[“彼得”、“迈克”、“杰夫”、“约翰”、“亚历克斯”、“乔”、“杰夫”、“彼得”、“亚历克斯”、“李”、“乔”、“汤姆”、“迈克”、“约翰”、“汤姆”、“彼得”],
‘排名’:[4,3,1,2,5,6,2,4,3,1,5,6,1,3,2,4],
‘评级’:[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)
对于id,分组中的dfg:
dfm=dfg.copy()
dfm['new_rank']=dict1[id]
df_new=pd.concat([df_new,dfm],sort=True)
这将创建一个新列“new_rank”,其中的值从dict1中为每个匹配_id提取
我还尝试了映射功能,但由于它不适用于组,因此它只是在每行上粘贴每个匹配id的整个值列表
有什么有效的方法可以做到这一点吗
另一方面,这是我编写字典的方式,字典根据“评级”列中的数字顺序计算新等级(如果你也能想出更好的方法来处理整个问题,请让我知道):
dict1={}
grouped=df.groupby('match_id',sort=False)
对于id,分组中的dfg:
dfm=dfg.copy()
dict1[id]=[len(dfm['rating'])-(排序(dfm['rating'],反向=False)。dfm['rating']中x的索引(x))
我之所以要查字典的逻辑,是因为我们可以马上解决这个问题。你只需要:
输出
match_id name rank rating new_rank
0 m1 peter 4 1200 5
1 m1 mike 3 1300 4
2 m1 jeff 1 1600 1
3 m1 john 2 1550 2
4 m1 alex 5 1150 6
5 m1 joe 6 1540 3
6 m2 jeff 2 1340 4
7 m2 peter 4 1300 5
8 m2 alex 3 1390 3
9 m2 li 1 1290 6
10 m2 joe 5 1450 2
11 m2 tom 6 1650 1
12 m3 mike 1 1420 2
13 m3 john 3 1490 1
14 m3 tom 2 1320 4
15 m3 peter 4 1410 3
你创建的词典的逻辑是什么?你能不能解释一下,而不是仅仅显示代码。这是我代码的另一部分,但可以放弃,因为这部分工作完美,速度非常快!谢谢不客气,请快速阅读。它可以帮助你提出正确的问题。
match_id name rank rating new_rank
0 m1 peter 4 1200 5
1 m1 mike 3 1300 4
2 m1 jeff 1 1600 1
3 m1 john 2 1550 2
4 m1 alex 5 1150 6
5 m1 joe 6 1540 3
6 m2 jeff 2 1340 4
7 m2 peter 4 1300 5
8 m2 alex 3 1390 3
9 m2 li 1 1290 6
10 m2 joe 5 1450 2
11 m2 tom 6 1650 1
12 m3 mike 1 1420 2
13 m3 john 3 1490 1
14 m3 tom 2 1320 4
15 m3 peter 4 1410 3