【问题标题】:Pandas: Rank item across columnsPandas:跨列对项目进行排名
【发布时间】:2017-01-05 18:59:21
【问题描述】:

我在尝试对 Pandas 中的列进行排名时遇到错误。这段代码 sn-p 运行良好,将 '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'>

(注意:我在设置 'axis=columns' 时也会出错)

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='average', numeric_only=None, na_option='keep', ascending=True, pct=False)

  • axis: {0 or ‘index’, 1 or ‘columns’},默认0 index to direct 排名

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您在理解 pandas 方面犯了一个关键错误。当您写df1['col a'] 时,您选择了一个列,现在有一个熊猫系列。 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 参数。我有点惊讶 pandas 甚至有这个参数可用于 Series 方法。也许其他人可以告诉我们为什么系列存在axis 参数,因为我从未使用过或见过它使用过。

    【讨论】:

    • 感谢 Ted 的回复和额外的解释。 Series vs Dataframe 和相应的方法很有帮助。您的回复解决了错误。
    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2018-04-11
    • 2021-01-05
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多