【问题标题】:Find maximum value of a column and return the corresponding row values using Pandas使用 Pandas 查找列的最大值并返回相应的行值
【发布时间】:2013-03-22 10:16:19
【问题描述】:

使用 Python Pandas 我试图找到具有最大值的 CountryPlace

这会返回最大值:

data.groupby(['Country','Place'])['Value'].max()

但是如何获取对应的CountryPlace 名称呢?

【问题讨论】:

标签: python pandas dataframe max


【解决方案1】:

使用DataFrame.nlargest

对此的专用方法是nlargest,它在后台使用algorithm.SelectNFrame,这是一种高效的做法:sort_values().head(n)

   x  y  a  b
0  1  2  a  x
1  2  4  b  x
2  3  6  c  y
3  4  1  a  z
4  5  2  b  z
5  6  3  c  z
df.nlargest(1, 'y')

   x  y  a  b
2  3  6  c  y

【讨论】:

    【解决方案2】:

    你可以使用:

    print(df[df['Value']==df['Value'].max()])
    

    【讨论】:

      【解决方案3】:

      为了以最大值打印国家和地点,请使用以下代码行。

      print(df[['Country', 'Place']][df.Value == df.Value.max()])
      

      【讨论】:

        【解决方案4】:

        导入熊猫
        df 是您创建的数据框。

        使用命令:

        df1=df[['Country','Place']][df.Value == df['Value'].max()]
        

        这将显示最大值的国家和地点。

        【讨论】:

          【解决方案5】:

          我在尝试使用 pandas 导入数据时遇到了类似的错误,我的数据集的第一列在单词开头之前有空格。我删除了空格,它就像一个魅力!

          【讨论】:

            【解决方案6】:

            我建议使用nlargest 以获得更好的性能和更短的代码。导入pandas

            df[col_name].value_counts().nlargest(n=1)
            

            【讨论】:

              【解决方案7】:

              我认为返回具有最大值的行的最简单方法是获取其索引。 argmax() 可用于返回最大值所在行的索引。

              index = df.Value.argmax()
              

              现在可以使用索引来获取该特定行的特征:

              df.iloc[df.Value.argmax(), 0:2]
              

              【讨论】:

                【解决方案8】:

                我在列中查找最大值的解决方案:

                df.ix[df.idxmax()]
                

                ,也是最小值:

                df.ix[df.idxmin()]
                

                【讨论】:

                  【解决方案9】:

                  假设df 有一个唯一索引,这将给出具有最大值的行:

                  In [34]: df.loc[df['Value'].idxmax()]
                  Out[34]: 
                  Country        US
                  Place      Kansas
                  Value         894
                  Name: 7
                  

                  注意idxmax 返回索引标签。所以如果DataFrame在索引中有重复,标签可能无法唯一标识行,所以df.loc可能返回不止一行。

                  因此,如果df 没有唯一索引,则必须先使索引唯一,然后再进行上述操作。根据 DataFrame,有时您可以使用 stackset_index 使索引唯一。或者,您可以简单地重置索引(使行重新编号,从 0 开始):

                  df = df.reset_index()
                  

                  【讨论】:

                    【解决方案10】:
                    df[df['Value']==df['Value'].max()]
                    

                    这将返回具有最大值的整行

                    【讨论】:

                    • 解释:- 内部表达式对整个数据帧的长度进行布尔检查,满足表达式右侧的索引(.max())返回索引,然后调用该数据帧的完整行
                    【解决方案11】:

                    国家和地方是系列的索引,如果不需要索引,可以设置as_index=False

                    df.groupby(['country','place'], as_index=False)['value'].max()
                    

                    编辑:

                    您似乎想要每个国家/地区都具有最大值的地方,以下代码将满足您的需求:

                    df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))
                    

                    【讨论】:

                    • 只会返回列名和数据类型
                    【解决方案12】:

                    使用DataFrameindex 属性。请注意,我没有输入示例中的所有行。

                    In [14]: df = data.groupby(['Country','Place'])['Value'].max()
                    
                    In [15]: df.index
                    Out[15]: 
                    MultiIndex
                    [Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]
                    
                    In [16]: df.index[0]
                    Out[16]: ('Spain', 'Manchester')
                    
                    In [17]: df.index[1]
                    Out[17]: ('UK', 'London')
                    

                    您还可以通过该索引获取值:

                    In [21]: for index in df.index:
                        print index, df[index]
                       ....:      
                    ('Spain', 'Manchester') 512
                    ('UK', 'London') 778
                    ('US', 'Mchigan') 854
                    ('US', 'NewYork') 562
                    

                    编辑

                    对不起,误会你想要什么,试试以下:

                    In [52]: s=data.max()
                    
                    In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
                    US, NewYork, 854
                    

                    【讨论】:

                    • 正确。但我正在寻找一个单行输出,上面写着“美国,堪萨斯州,894”
                    • 谢谢。这将解决当前数据集的问题,其中只有 1 列具有值。当有更多具有值的列时,@unutbu 的解决方案会更好。还是谢谢。
                    猜你喜欢
                    • 1970-01-01
                    • 2019-11-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-02-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多