python - pandas 按年份分组数据并根据多(二)列给出排名
问题描述
经过几个小时的研究,我仍然无法按年份对数据进行分组并根据两个列给出排名,这样只要第一个列中的值相同,排名就没有联系。
我只能根据两列给出排名,但我无法先对数据进行分组。以下是我所做的。
>>> import pandas as pd
>>> data = pd.read_csv('C:/Users/Ene_E/Desktop/Data/data.csv')
>>> cols = ['score1', 'score2']
>>> tups = data[cols].sort_values(cols, ascending=False).apply(tuple, 1)
>>> f, i = pd.factorize(tups)
>>> factorized = pd.Series(f + 1, tups.index)
>>> wellranked = data.assign(Rank=factorized)
>>> wellranked.to_csv('wellrank.csv')
以下是我的数据示例
name year score1 score2
brand1 2015 2500 5
brand2 2015 2500 3
brand3 2015 1500 7
brand1 2016 3200 2
brand2 2016 3000 4
brand3 2016 2100 6
我的代码产生了这个
name year score1 score2 Rank
brand1 2015 2500 1 3
brand2 2015 2500 2 4
brand3 2015 1500 3 6
brand1 2016 3200 1 1
brand2 2016 3000 2 2
brand3 2016 2100 3 5
但我想要这样..
name year score1 score2 Rank
brand1 2015 2500 1 1
brand2 2015 2500 2 2
brand3 2015 1500 3 3
brand1 2016 3200 1 2
brand2 2016 3300 2 1
brand3 2016 2100 3 3
解决方案
我认为您GroupBy.transform
需要year
:
cols = ['score1', 'score2']
tups = data[cols].sort_values(cols, ascending=False).apply(tuple, 1)
factorized = tups.groupby(data['year']).transform(lambda x: pd.factorize(x)[0]+1)
wellranked = data.assign(Rank=factorized)
print (wellranked)
name year score1 score2 Rank
0 brand1 2015 2500 5 1
1 brand2 2015 2500 3 2
2 brand3 2015 1500 7 3
3 brand1 2016 3200 2 1
4 brand2 2016 3000 4 2
5 brand3 2016 2100 6 3
推荐阅读
- angular - 未捕获的类型错误:无法读取未定义 core.js:24134 的属性“id”
- hadoop - 损坏的名称节点元数据的首选解决方案是什么
- c# - 即使在 C# 中调用 GC.Collect() 之后,对于 int 变量,GC.GetGeneration() 也始终返回 0
- semantic-release - 仅使用语义释放应用标签
- android - 我想保存在手机下载文件夹中生成的pdf,但我无法保存
- javascript - JavaScript 秒表(无法设置属性 'innerHTML' of null 错误)
- python - RuntimeError:索引 3 处的输入张量具有无效的形状 [2, 2, 16, 128, 64] 但预期为 [2, 4, 16, 128, 64]
- java - 对象对具体类的依赖
- pandas - 熊猫替换多个单词
- python - 从文本 Python 中删除括号中的时间戳