【问题标题】:Get column names for the N Max/Min values per row in Pandas获取 Pandas 中每行 N Max/Min 值的列名
【发布时间】:2019-07-20 13:48:14
【问题描述】:

我正在尝试为每一行获取最大/最小值最多为 N 值的列的名称。

鉴于这样的事情:

a     b     c     d     e
1.2   2     0.1   0.8   0.01
2.1   1.1   3.2   4.6   3.4
0.2   1.9   8.8   0.3   1.3
3.3   7.8   0.12  3.2   1.4

我可以用idxmax(axis=1) 得到最大值,用idxmin(axis=1) 得到最小值,但这仅适用于最高最大值和最低最小值,不适用于 N 值。

我想得到,如果用 N=2 调用:

a     b     c     d     e     Max1    Max2    Min1    Min2    
1.2   2.0   0.1   0.8   0.1   b       a       c       e
2.1   1.1   3.2   4.6   3.4   d       d       b       a
0.2   1.9   8.8   0.3   1.3   c       b       a       d
3.3   7.8   0.1   3.2   1.4   b       a       c       e

我知道我总是可以获取行数据,计算第 N 个值并按索引映射到列名列表,只是想知道是否有更好、更优雅的方法。

【问题讨论】:

  • 最大和第二大列名的顺序(最小的列名反之亦然)重要吗?
  • 就我而言,没关系。感谢您提供边缘案例选项。

标签: python pandas max min


【解决方案1】:

您可以使用 nlargest 和 nsmallest:

In [11]: res = df.apply(lambda x: pd.Series(np.concatenate([x.nlargest(2).index.values, x.nsmallest(2).index.values])), axis=1)

In [12]: res
Out[12]:
   0  1  2  3
0  b  a  e  c
1  d  e  b  a
2  c  b  a  d
3  b  a  c  e

In [13]: df[["Max1", "Max2", "Min1", "Min2"]] = res

In [14]: df
Out[14]:
     a    b     c    d     e Max1 Max2 Min1 Min2
0  1.2  2.0  0.10  0.8  0.01    b    a    e    c
1  2.1  1.1  3.20  4.6  3.40    d    e    b    a
2  0.2  1.9  8.80  0.3  1.30    c    b    a    d
3  3.3  7.8  0.12  3.2  1.40    b    a    c    e

【讨论】:

    【解决方案2】:

    如果最大/最小值和第二大/最小值的顺序无关紧要,那么您可以使用np.argpartition

    N = 2 # Number of min/max values 
    u = np.argpartition(df, axis=1, kth=N).values
    v = df.columns.values[u].reshape(u.shape)
    

    maxdf = pd.DataFrame(v[:,-N:]).rename(columns=lambda x: f'Max{x+1}')
    mindf = pd.DataFrame(v[:,:N]).rename(columns=lambda x: f'Min{x+1}')
    
    pd.concat([df, maxdf, mindf], axis=1)
    
         a    b     c    d     e Max1 Max2 Min1 Min2
    0  1.2  2.0  0.10  0.8  0.01    b    a    e    c
    1  2.1  1.1  3.20  4.6  3.40    d    e    b    a
    2  0.2  1.9  8.80  0.3  1.30    b    c    a    d
    3  3.3  7.8  0.12  3.2  1.40    a    b    c    e
    

    【讨论】:

    • 确实是另一种选择,谢谢。快速说明一下,v[:,-2:] 和 v[:,:2] 应该是 N 的函数。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 2022-12-13
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多