【问题标题】:Get Max Value of a Row in subset of Column respecting a condition获取关于条件的列子集中行的最大值
【发布时间】:2021-03-27 10:04:02
【问题描述】:

我有一个如下所示的数据框:

FakeDist -5 -4 -3 -2 -1 0 1 2 3 4 5
1 37 14 17 29 31 34 32 31 21 17 18
2 12 13 12 16 30 33 37 32 32 15 42
3 40 16 29 31 36 32 30 19 16 15 12
4 12 14 12 28 28 30 29 27 16 18 33
5 12 13 16 17 28 32 33 30 29 17 35

我想添加一列作为每行最大值的 Column_Name。
我这样做了:

df['MaxVal_Dist'] = df.idxmax(axis=1)  

这给了我这个df:

FakeDist -5 -4 ... MaxVal_Dist
1 37 14 ... -5
2 12 13 ... 5
3 40 16 ... -5
4 12 14 ... 5
5 12 13 ... 5

但我真正的目的是添加一个 if 条件。我想要'FakeDist'在-2和2之间的列的最大值。得到以下结果:

FakeDist -5 -4 ... MaxVal_Dist
1 37 14 ... 0
2 12 13 ... 1
3 40 16 ... -1
4 12 14 ... 0
5 12 13 ... 1

我确实尝试查看如何添加df.apply,但找不到如何使其工作。
我有一个“解决方法”的想法,即将列的子集(从-2到2)存储在一个新的数据框中,创建我的新列以获得最大值,然后将该结果列添加到我的初始数据框但是在我看来,这不是一个优雅的解决方案,我相信还有很多更好的事情要做。

我很高兴向您学习优雅的方法!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用boolean indexingloc 来过滤-22 范围内的列,然后使用idxmaxaxis=1

    c = df.columns.astype(int)
    df['MaxVal_Dist'] = df.loc[:, (c >= -2) & (c <= 2)].idxmax(1)
    

    结果:

    FakeDist  -5  -4  -3  -2  -1   0   1   2   3   4   5 MaxVal_Dist
    1         37  14  17  29  31  34  32  31  21  17  18           0
    2         12  13  12  16  30  33  37  32  32  15  42           1
    3         40  16  29  31  36  32  30  19  16  15  12          -1
    4         12  14  12  28  28  30  29  27  16  18  33           0
    5         12  13  16  17  28  32  33  30  29  17  35           1
    

    【讨论】:

    • 这非常适合我想做的事情!谢谢舒巴姆。对于所有像我一样迷路的人,如果你的数字有小数,它也有效。另外,请确保您的第一行是标题!我的不是,所以它最初不起作用。我跟着这个:link
    【解决方案2】:

    你可以试试List comprehension:

    In [1159]: cols = [i for i in df.columns[1:] if -2 <= int(i) <= 2]
    
    In [1161]: df['MaxVal_Dist'] = df[cols].idxmax(axis=1)
    
    In [1162]: df
    Out[1162]: 
       FakeDist  -5  -4  -3  -2  -1   0   1   2   3   4   5 MaxVal_Dist
    0         1  37  14  17  29  31  34  32  31  21  17  18           0
    1         2  12  13  12  16  30  33  37  32  32  15  42           1
    2         3  40  16  29  31  36  32  30  19  16  15  12          -1
    3         4  12  14  12  28  28  30  29  27  16  18  33           0
    4         5  12  13  16  17  28  32  33  30  29  17  35           1
    

    【讨论】:

    • 这也非常适合我想做的事情!谢谢玛雅克。对于所有像我一样迷路的人,如果你的数字有小数,它也有效。另外,请确保您的第一行是标题!我的不是,所以它最初不起作用。我跟着这个:link
    猜你喜欢
    • 2015-11-21
    • 2015-02-01
    • 1970-01-01
    • 2014-12-17
    • 2022-11-22
    • 2022-01-09
    • 2014-01-30
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多