Pandas 密集排序
- 2025-03-04 08:26:00
- admin 原创
- 41
问题描述:
我正在处理熊猫数据框并有一个如下框架:
Year Value
2012 10
2013 20
2013 25
2014 30
我想创建一个相当于 DENSE_RANK () over (按年份排序) 的函数。创建一个像这样的附加列:
Year Value Rank
2012 10 1
2013 20 2
2013 25 2
2014 30 3
在熊猫中如何做到这一点?
谢谢!
解决方案 1:
pd.Series.rank
与使用method='dense'
df['Rank'] = df.Year.rank(method='dense').astype(int)
df
解决方案 2:
最快的解决方案是factorize
:
df['Rank'] = pd.factorize(df.Year)[0] + 1
时间:
#len(df)=40k
df = pd.concat([df]*10000).reset_index(drop=True)
In [13]: %timeit df['Rank'] = df.Year.rank(method='dense').astype(int)
1000 loops, best of 3: 1.55 ms per loop
In [14]: %timeit df['Rank1'] = df.Year.astype('category').cat.codes + 1
1000 loops, best of 3: 1.22 ms per loop
In [15]: %timeit df['Rank2'] = pd.factorize(df.Year)[0] + 1
1000 loops, best of 3: 737 µs per loop
解决方案 3:
您可以将年份转换为分类,然后获取其代码(添加一个,因为它们是零索引,并且您希望初始值从每个示例中的一开始就有一个)。
df['Rank'] = df.Year.astype('category').cat.codes + 1
>>> df
Year Value Rank
0 2012 10 1
1 2013 20 2
2 2013 25 2
3 2014 30 3
解决方案 4:
Groupby.ngroup
默认对键进行排序,因此较小的年份标签较低。可以设置sort=False
根据发生顺序对组进行排名。
df['Rank'] = df.groupby('Year', sort=True).ngroup()+1
np.unique
同样进行排序,因此将return_inverse
较小的值排在最低。
df['Rank'] = np.unique(df['Year'], return_inverse=True)[1]+1
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD