Python 熊猫密级
我处理的是熊猫数据帧,有一个这样的帧:Python 熊猫密级,python,sql,pandas,Python,Sql,Pandas,我处理的是熊猫数据帧,有一个这样的帧: Year Value 2012 10 2013 20 2013 25 2014 30 Year Value Rank 2012 10 1 2013 20 2 2013 25 2 2014 30 3 我想在(按年份排序)函数上建立一个与稠密_秩()相等的函数。要创建类似以下内容的附加列,请执行以下操作: Year Value 2012 10 2013 20 201
Year Value
2012 10
2013 20
2013 25
2014 30
Year Value Rank
2012 10 1
2013 20 2
2013 25 2
2014 30 3
我想在(按年份排序)函数上建立一个与稠密_秩()相等的函数。要创建类似以下内容的附加列,请执行以下操作:
Year Value
2012 10
2013 20
2013 25
2014 30
Year Value Rank
2012 10 1
2013 20 2
2013 25 2
2014 30 3
如何在熊猫身上做到这一点
谢谢 您可以将年份转换为分类,然后获取它们的代码(添加一个,因为它们是零索引的,并且您希望每个示例的初始值以一开始)
使用
pd.Series.rank
和method='dense'
df['Rank'] = df.Year.rank(method='dense').astype(int)
df
最快的解决方案是:
计时:
#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
Groupby.ngroup
默认情况下,将对键进行排序,以便较小的年份标记为较低。可以将sort=False
设置为根据发生顺序对组进行排序
df['Rank'] = df.groupby('Year', sort=True).ngroup()+1
np.unique
也进行排序,因此使用return\u inverse
对较小的值进行最低排序
df['Rank'] = np.unique(df['Year'], return_inverse=True)[1]+1
请注意,在调用
factorize
时,您需要使用sort=True
,这也会影响您的计时(在我随机生成的3M大数值df中,方法1,即使用rank
方法证明是最快的)。您之所以认为它有效,是因为数组的非重复元素已经排序。是的,但这取决于数据是否排序。在样本中是排序的,所以没有必要。事实上,这就是我所说的。因为它是经过排序的,所以分解会更快。一般来说,数据是不排序的,因此factorize和rank将返回不同的答案。我添加这一评论是为了警告未来的读者,他们会盲目地接管解决方案,而不检查假设它们在什么条件下工作。@OliverW。-谢谢你。@piRSquared-谢谢,它终于出现了。我对你的解决方案投了赞成票;)