python - 熊猫数据框,按另一列中的值排名,不使用 Python FOR 循环
问题描述
对于一列的每个值(下面我的示例中的“日期”),我想按另一列中的值排名(我的示例中的“值”列)
我的代码有效,但我想知道是否可以在没有 Python for 循环的情况下完成
data = {'code': ['AAA', 'AAA', 'AAA', 'BBB', 'BBB', 'BBB', 'CCC', 'CCC', 'CCC'],
'date': ['2001-01-01', '2001-01-02', '2001-01-03', '2001-01-01', '2001-01-02', '2001-01-03', '2001-01-01', '2001-01-02', '2001-01-03'],
'value': [32, 23, 34, 23, 34, 12, 28, 39, 40]}
df = pd.DataFrame(data)
print(df)
pd.set_option('mode.chained_assignment', None)
result = pd.DataFrame()
for date in df['date'].unique():
sub = df[df['date'] == date]
sub['rank'] = len(sub) - sub['value'].rank() + 1
result = result.append(sub[['code', 'date', 'rank']])
pd.set_option('mode.chained_assignment', 'warn')
df2 = pd.merge(df, result, on=['code', 'date'])
print(df2.sort_values(['date', 'code'])) # within each date, rows are ranked by value
code date value rank
0 AAA 2001-01-01 32 1.0
3 BBB 2001-01-01 23 3.0
6 CCC 2001-01-01 28 2.0
1 AAA 2001-01-02 23 3.0
4 BBB 2001-01-02 34 2.0
7 CCC 2001-01-02 39 1.0
2 AAA 2001-01-03 34 2.0
5 BBB 2001-01-03 12 3.0
8 CCC 2001-01-03 40 1.0
我可以在不通过 Python for 循环迭代的情况下获得相同的结果吗?
解决方案
让我们这样rank
做groupby
df['rank'] = df.groupby('code')['value'].rank()
df
Out[491]:
code date value rank
0 AAA 2001-01-01 32 2.0
1 AAA 2001-01-02 23 1.0
2 AAA 2001-01-03 34 3.0
3 BBB 2001-01-01 23 2.0
4 BBB 2001-01-02 34 3.0
5 BBB 2001-01-03 12 1.0
6 CCC 2001-01-01 28 1.0
7 CCC 2001-01-02 39 2.0
8 CCC 2001-01-03 40 3.0
推荐阅读
- java - 如何在超级抽象类中使用@Bean?
- c++ - 使用 Visual c++ 的 SQL-Server,连接失败 (SQL_ERROR)
- regex - 使用 Notepad++ 删除 @ 之前少于 5 个字符的行
- angular - 如何在角度材料中获取 MatSelect 元素(多选)的当前状态
- javascript - 仅显示文件输入中的文本
- angular - “可观察”类型上不存在属性“第一”
' - multithreading - 虽然 python 多线程,但在 IF 处缩进会改变一切
- apache - 自动更改我的本地主机的 url
- javascript - 测试角度绑定
- java - Eclipse RCP 中的动态字段和方法注入