熊猫:列中的排名项目

时间:2017-01-04 17:33:17

标签: python pandas

我在尝试对Pandas中的列进行排名时遇到错误。此代码段运行良好,排名' col a'反对自己(例如AAPL col A是同伴col A中最小的)。

df1 = df[['col a', 'col b', 'col c']]
df1 = df1[:5]
df1['rank'] = df1['col a'].rank(axis=0)
print(df1)

             col a          col b          col c      rank 
ticker                                                   
AAPL         0.336250       0.277405       0.243450   1.0
GOOGL        0.536069       0.545514       0.538530   2.5
GOOG         0.536069       0.545514       0.538530   2.5
MSFT         0.546128       0.886630       0.601523   4.0
BRK.B        0.695393       0.738491       0.753857   5.0

我想针对AAPL col a对AAPL ['col a', 'col b', 'col c']进行排名。 AAPL的结果是3.0。

Pandas文档建议(至少对我来说)您可以将axis=1设置为跨列排名。但是,我收到以下错误:

ValueError: No axis named 1 for object type <class pandas.core.series.Series'>

(注意:设置&#39; axis = columns&#39;)

也会出错
df1 = df[['col a', 'col b', 'col c']]
df1 = df1[:5]
df1['rank'] = df1['col a'].rank(axis=1)
print(df1)

相关的Pandas文档

  • DataFrame.rank(axis = 0,method =&#39; average&#39;,numeric_only = None,na_​​option =&#39; keep&#39;,ascending = True,pct = False )

  • axis:{0或'index',1或'columns'},默认为0指向直接 排名

1 个答案:

答案 0 :(得分:3)

你在理解大熊猫时犯了一个关键错误。当你写df1['col a']时,你已经选择了一个列,现在有了一个pandas系列。 Pandas系列只有一个轴(轴0),没有像数据帧那样的水平轴。您可以做的是在整个数据框中使用排名,然后选择col a这样的排名。

df['rank'] = df.rank(axis=1)['col a']

输出

           col a     col b     col c  rank
ticker                                    
AAPL    0.336250  0.277405  0.243450   3.0
GOOGL   0.536069  0.545514  0.538530   1.0
GOOG    0.536069  0.545514  0.538530   1.0
MSFT    0.546128  0.886630  0.601523   1.0
BRK.B   0.695393  0.738491  0.753857   1.0

使用numpy

numpy为argsort做了类似的事情。它会快一点。

np.argsort(df).add(1)['col a']

关于轴的进一步讨论

以下df1['col a'].rank(axis=0)有效,因为即使df1['col a']返回一个系列,因为其唯一的轴称为0。这应该会让你感到奇怪,你甚至需要声明为Series操作选择哪个轴,事实上我不知道为什么要使用Series的axis参数。我有点惊讶,大熊猫甚至有这个参数可用于系列方法。也许其他人可以告诉我们为什么系列存在axis参数,因为我从未使用它或看过它。