2016-11-04 50 views
1

我不确定这是一个错误还是一个功能,但我真的想了解它是如何工作的。熊猫排名与变换('排名')

我有一个非常简单的数据集

In [0]: data 
Out[0]: 
    group value data 
0  A  1  1 
1  A  2  1 
2  B  3  1 
3  B  4  1 

然后,我有一些转变:

In [1]: data.groupby('group').transform('rank') 
Out[1]: 
    value data 
0 1.0 1.5 
1 2.0 1.5 
2 1.0 1.5 
3 2.0 1.5 

In [2]: data.groupby('group').value.transform('rank') 
Out[2]: 
0 1 
1 1 
2 2 
3 2 

In [3]: data.groupby('group').data.transform('rank') 
Out[3]: 
0 1.5 
1 1.5 
2 1.5 
3 1.5 

In [4]: data.groupby('group').transform('rank').value 
Out[4]: 
0 1.0 
1 2.0 
2 1.0 
3 2.0 

In [5]: data.groupby('group').value.rank() 
Out[5]: 
0 1.0 
1 2.0 
2 1.0 
3 2.0 

In [6]: data.groupby('group').cumcount() 
Out[6]: 
0 0 
1 1 
2 0 
3 1 

这个事情我觉得奇怪:

  • 首届之一。虽然我似乎明白value列发生了什么(类似于第5和第6)我不明白data列发生了什么。 1.5的值从哪里来的?
  • 第二个。不是只选择指定的列并应用与第1列类似的逻辑,它完全改变了输出。我可以推测现在枚举组而不是组内的行,但我仍然不明白为什么它以这样一种奇怪的方式完成?
  • 第三个。它的行为与预期完全一致,因为它只是选择了指定的列并应用了第一个逻辑(与之前的逻辑相反)。但是我仍然错过了这个价值的来源;
  • 第四个。这不应该和第二个一样吗?
  • 第5个和第6个看起来完全一样,但后一个从0开始。它是正确的吗?

如果有人能向我解释,我将非常感激。

谢谢。

回答

0

让我再添加一点混淆 - rank()方法有一个method参数...

默认:method='average'

In [70]: data.groupby('group').transform('rank') 
Out[70]: 
    value data 
0 1.0 1.5 
1 2.0 1.5 
2 1.0 1.5 
3 2.0 1.5 

In [71]: data.groupby('group').transform('rank', method='average') 
Out[71]: 
    value data 
0 1.0 1.5 
1 2.0 1.5 
2 1.0 1.5 
3 2.0 1.5 

方法:min

In [72]: data.groupby('group').transform('rank', method='min') 
Out[72]: 
    value data 
0 1.0 1.0 
1 2.0 1.0 
2 1.0 1.0 
3 2.0 1.0 

方法:max

In [73]: data.groupby('group').transform('rank', method='max') 
Out[73]: 
    value data 
0 1.0 2.0 
1 2.0 2.0 
2 1.0 2.0 
3 2.0 2.0 

方法:first

In [74]: data.groupby('group').transform('rank', method='first') 
Out[74]: 
    value data 
0 1.0 1.0 
1 2.0 2.0 
2 1.0 1.0 
3 2.0 2.0 

方法:dense

In [75]: data.groupby('group').transform('rank', method='dense') 
Out[75]: 
    value data 
0 1.0 1.0 
1 2.0 1.0 
2 1.0 1.0 
3 2.0 1.0 

docs

方法:{averageminmaxfirstdense}

平均:组

的平均等级

分钟:在组最低秩

最大:在组最高秩

第一:如“分钟”,但秩总是通过增加:分配,以便它们出现在阵列中

致密行列组

之间1

和有另一个参数:

PCT:布尔型,默认为false

计算数据

+0

的百分比排位那绝对会让事情变得更加混乱给我。但是我仍然不明白两件事:1)'data'列的计算是如何计算的? 1和1的平均值如何为1.5? 2)为什么它看起来像应用于'value'和'data'列的逻辑不同? –