Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫密级_Python_Sql_Pandas - Fatal编程技术网

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-谢谢,它终于出现了。我对你的解决方案投了赞成票;)