【问题标题】:How to find single largest value from all rows and column array in Python and also show its row and column index如何从 Python 中的所有行和列数组中找到单个最大值并显示其行和列索引
【发布时间】:2019-05-14 14:52:56
【问题描述】:

我是 python 新手。我想从网格中找到一个最大值,并在输出中显示其各自的行和列索引标签。该值应该是绝对的。 (与 + 或 - 号无关) 我的数据结构如图所示: My data set

EleNo._ Exat0_  Exat10_ Exat20_ Exat30_ Exat40_ Exat50

1000____ 10____   20___  -30____  23_____ 28____  18

2536____-20___   -36___  -33___  -38_____ 2____  -10

3562_____ 3____    4______ 8_____  8_____ 34_____  4

2561_____ 2____    4______ 7_____  6_____ 22____  20

我尝试了(df.abs().max()),但它显示了每一行的最大值,并且只有正值。我想要绝对最大值。

预期结果: what i want in output

EleNo.: 2536

Exat30 : -38

实际结果: what i am getting in output

Element No. 3562

Exat0:  20

Exat10: 36

Exat20: 33

Exat30: 38

Exat40: 34

Exat50: 20

【问题讨论】:

    标签: python pandas numpy dataframe max


    【解决方案1】:

    使用numpy.unravel_index作为索引,并通过带有索引的构造函数创建DataFrame:

    df = pd.DataFrame({'Exat0': [10, -20, 3, 2], 
                       'Exat10': [20, -36, 4, 4], 
                       'Exat20': [-30, -33, 8, 7], 
                       'Exat30': [23, -38, 8, 6],
                       'Exat40': [28, 2, 34, 22], 
                       'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
    df.index.name='EleNo.'
    print (df)
            Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
    EleNo.                                               
    1000       10      20     -30      23      28      18
    2536      -20     -36     -33     -38       2     -10
    3562        3       4       8       8      34       4
    2561        2       4       7       6      22      20
    

    a = df.abs().values
    r,c = np.unravel_index(a.argmax(), a.shape)
    print (r, c)
    1 3
    
    df1 = pd.DataFrame(df.values[r, c], 
                       columns=[df.columns.values[c]], 
                       index=[df.index.values[r]])
    df1.index.name='EleNo.'
    print (df1)
            Exat30
    EleNo.        
    2536       -38
    

    另一个唯一的熊猫解决方案,DataFrame.absDataFrame.stackSeries.idxmax 的最大值索引:

    r1, c1 = df.abs().stack().idxmax()
    

    最后选择DataFrame.loc

    df1 = df.loc[[r1], [c1]]
    print (df1)
            Exat30
    EleNo.        
    2536       -38
    

    编辑:

    df = pd.DataFrame({'Exat0': [10, -20, 3, 2], 
                       'Exat10': [20, -36, 4, 4], 
                       'Exat20': [-30, -33, 8, 7], 
                       'Exat30': [23, -38, 8, 6],
                       'Exat40': [28, 2, 34, -38], 
                       'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
    df.index.name='EleNo.'
    print (df)
            Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
    EleNo.                                               
    1000       10      20     -30      23      28      18
    2536      -20     -36     -33     -38       2     -10
    3562        3       4       8       8      34       4
    2561        2       4       7       6     -38      20
    
    s = df.abs().stack()
    mask = s == s.max()
    
    df1 = df.stack()[mask].unstack()
    print (df1)
            Exat30  Exat40
    EleNo.                
    2536     -38.0     NaN
    2561       NaN   -38.0
    
    df2 = df.stack()[mask].reset_index()
    df2.columns = ['EleNo.','cols','values']
    print (df2)
       EleNo.    cols  values
    0    2536  Exat30     -38
    1    2561  Exat40     -38
    

    【讨论】:

    • 谢谢。但是输出有两个问题。即使行值更改,每次都会显示EleNo. 3562。索引应针对从第 1 列到第 6 列的相应最大值进行更改。此外,如果正值大于 -38,即特定行的 +45,输出仍将 -38 显示为最大值。我想要最大的数值
    • @AkshayK。 - 添加了示例数据,你能用它测试我的解决方案吗?因为如果最大或最小更改数据,那么它对我来说很好。例如。 df = pd.DataFrame({'EleNo.': [1000, 2536, 3562, 2561], 'Exat0': [10, -200, 3, 2], 'Exat10': [20, -36, 4, 4], 'Exat20': [-30, -33, 8, 7], 'Exat30': [23, -38, 8, 6], 'Exat40': [28, 2, 34, 22], 'Exat50': [18000, -10, 4, 20]}) print (df)
    • 谢谢。其实我不想要“EleNo”的最大价值。柱子。我想从列名(Exat0 到 Exat50)中找到最大值。只有来自 (EleNo) 的相应行值必须显示。对于您的示例数组,我希望以 EleNo 的形式输出。 :1000,Exat50:18000。谢谢
    • @AkshayK。 - 现在明白了,经过修改的答案。
    • 发布了修改后的问题
    【解决方案2】:

    结合使用 max() 和 dropna()

    首先创建一个数据框:

    df = pd.DataFrame(np.random.randn(4,4))
    
              0         1         2         3
    0  0.051775  0.352410 -0.451630 -0.452446
    1 -1.434128  0.516264 -0.807776 -0.077892
    2  1.615521  0.870604 -0.010285 -0.322280
    3 -0.027598  1.046129 -0.165166  0.365150
    

    计算max()两次,得到dataframe中的最大值,然后用nan切掉行列。

    result = df[df == abs(df).max().max()].dropna(axis=0, how="all").dropna(axis=1, how='all')
    
    print(result)
              0
    2  1.615521
    

    最后,得到列和行的值,加上最大值。

    max_value = result.values.item()
    max_column = result.columns.values[0]
    max_row = result.index.values[0]
    
    print('max_value', max_value, 'max_column', max_column,'max_row', max_row)
    
    max_value 1.615520522284493 max_column 0 max_row 2
    

    【讨论】:

      【解决方案3】:

      您的问题是您忘记告诉 pandas 列 EleNo. 是索引。在那之后,事情就变得更简单了:只需用每行的绝对值的最大值构建一个系列,获取该系列的最大值的索引,并使用它在原始数据框中找到所需的行。代码可能是:

      s = df.set_index('EleNo.').apply(np.absolute).max(axis=1)
      
      print(df[df['EleNo.'] == s[s == s.max()].index[0]])
      

      按预期显示:

         EleNo.  Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
      1    2536    -20     -36     -33     -38       2     -10
      

      【讨论】:

      • 显示应该只包括EleNo. 2356Exat30 -38,其余的不得显示。
      • 我只想要来自Exat0 to Exat50 列的最大值及其对应的来自EleNo. 列的索引值
      • 您应该使用abs 而不是apply
      猜你喜欢
      • 2019-10-02
      • 2019-10-09
      • 2019-10-01
      • 1970-01-01
      • 2020-01-28
      • 2011-12-12
      • 2019-10-10
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多