熊猫排名与变换('排名')

Vik*_*hov 5 python pandas

我不确定这是一个错误还是一个功能,但我真的很想了解它是如何工作的。

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

In [0]: data
Out[0]:
  group  value  data
0     A      1     1
1     A      2     1
2     B      3     1
3     B      4     1
Run Code Online (Sandbox Code Playgroud)

然后我有一些转变:

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
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪的事情:

  • 第一个。虽然我似乎理解value列发生了什么(类似于第五和第六列),但我无法理解data列发生了什么。价值从何1.5而来?
  • 第二个。它不是仅选择指定的列并应用类似于第一列的逻辑,而是完全改变了输出。我可以假设现在枚举组而不是组内的行,但我仍然不明白为什么它会以如此奇怪的方式完成?
  • 第三个。它的行为完全符合预期,因为它只是选择了指定的列并应用了与第一个列相同的逻辑(与前一个列相反)。但我仍然不知道这个值的起源;
  • 第四个。这个不应该和第二个一样吗?
  • 第5个和第6个看起来一模一样,但后者是从0开始的,对吗?

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

谢谢。

Max*_*axU 3

让我添加更多的混乱 -rank ()方法有一个method参数......

\n

默认:method=\'average\'

\n
In [70]: data.groupby(\'group\').transform(\'rank\')\nOut[70]:\n   value  data\n0    1.0   1.5\n1    2.0   1.5\n2    1.0   1.5\n3    2.0   1.5\n\nIn [71]: data.groupby(\'group\').transform(\'rank\', method=\'average\')\nOut[71]:\n   value  data\n0    1.0   1.5\n1    2.0   1.5\n2    1.0   1.5\n3    2.0   1.5\n
Run Code Online (Sandbox Code Playgroud)\n

方法:min

\n
In [72]: data.groupby(\'group\').transform(\'rank\', method=\'min\')\nOut[72]:\n   value  data\n0    1.0   1.0\n1    2.0   1.0\n2    1.0   1.0\n3    2.0   1.0\n
Run Code Online (Sandbox Code Playgroud)\n

方法:max

\n
In [73]: data.groupby(\'group\').transform(\'rank\', method=\'max\')\nOut[73]:\n   value  data\n0    1.0   2.0\n1    2.0   2.0\n2    1.0   2.0\n3    2.0   2.0\n
Run Code Online (Sandbox Code Playgroud)\n

方法:first

\n
In [74]: data.groupby(\'group\').transform(\'rank\', method=\'first\')\nOut[74]:\n   value  data\n0    1.0   1.0\n1    2.0   2.0\n2    1.0   1.0\n3    2.0   2.0\n
Run Code Online (Sandbox Code Playgroud)\n

方法:dense

\n
In [75]: data.groupby(\'group\').transform(\'rank\', method=\'dense\')\nOut[75]:\n   value  data\n0    1.0   1.0\n1    2.0   1.0\n2    1.0   1.0\n3    2.0   1.0\n
Run Code Online (Sandbox Code Playgroud)\n

来自文档

\n
\n

方法: { averageminmaxfirstdense}

\n

平均:组的平均排名

\n

min:组中最低排名

\n

max:组中最高排名

\n

第一:按照它们在数组中出现的顺序分配排名

\n

密集:如\xe2\x80\x98min\xe2\x80\x99,但组之间的等级总是增加1

\n
\n

还有另一个参数:

\n
\n

pct : 布尔值,默认 False

\n

计算数据的百分比排名

\n
\n