我在尝试对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指向直接 排名
答案 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为argsort
做了类似的事情。它会快一点。
np.argsort(df).add(1)['col a']
以下df1['col a'].rank(axis=0)
有效,因为即使df1['col a']
返回一个系列,因为其唯一的轴称为0
。这应该会让你感到奇怪,你甚至需要声明为Series操作选择哪个轴,事实上我不知道为什么要使用Series的axis
参数。我有点惊讶,大熊猫甚至有这个参数可用于系列方法。也许其他人可以告诉我们为什么系列存在axis
参数,因为我从未使用它或看过它。