查找列的最大值并使用 Panda 返回相应的行值

Structure of data;

使用 Python 熊猫我试图找到 CountryPlace的最大值。

这将返回最大值:

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

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

526575 次浏览

使用 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

国家和地点是这个系列的索引,如果你不需要这个索引,你可以设置 as_index=False:

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

编辑:

看起来你想要每个国家的最大价值的地方,下面的代码将做你想要的:

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

假设 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()

若要打印具有最大值的 Country 和 Place,请使用以下代码行。

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

这将返回带有 max 值的整行

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

index = df.Value.argmax()

现在,索引可以用来获取特定行的特性:

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

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

df.ix[df.idxmax()]

,也最低限度:

df.ix[df.idxmin()]

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

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

我在使用熊猫导入数据时也遇到了类似的错误,数据集的第一列在单词开始之前有空格。我移除了空格,效果非常好! !

你可使用:

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

进口熊猫
Df 是您创建的数据框架。

使用以下命令:

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

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

使用 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