从pandas dataframe整体返回最大值,而不是基于列或行

t40tm48m  于 2023-05-27  发布在  其他
关注(0)|答案(7)|浏览(187)

我试图从整个Pandas Dataframe 中获取最大值。我对它来自哪一行或哪一列不感兴趣。我只对DataFrame中的单个最大值感兴趣。
下面是我的DataFrame:

df = pd.DataFrame({'group1': ['a','a','a','b','b','b','c','c','d','d','d','d','d'],
                        'group2': ['c','c','d','d','d','e','f','f','e','d','d','d','e'],
                        'value1': [1.1,2,3,4,5,6,7,8,9,1,2,3,4],
                        'value2': [7.1,8,9,10,11,12,43,12,34,5,6,2,3]})

这是它看起来的样子:

group1 group2  value1  value2
0       a      c     1.1     7.1
1       a      c     2.0     8.0
2       a      d     3.0     9.0
3       b      d     4.0    10.0
4       b      d     5.0    11.0
5       b      e     6.0    12.0
6       c      f     7.0    43.0
7       c      f     8.0    12.0
8       d      e     9.0    34.0
9       d      d     1.0     5.0
10      d      d     2.0     6.0
11      d      d     3.0     2.0
12      d      e     4.0     3.0

预期输出:

43.0

我假设df.max()可以完成这项工作,但它为每一列返回一个最大值,但我对此不感兴趣。我需要整个 Dataframe 的最大值。

eh57zj3b

eh57zj3b1#

DataFrame中所有值的最大值可以使用df.to_numpy().max()获得,或者对于pandas < 0.24.0,我们使用df.values.max()

In [10]: df.to_numpy().max()
Out[10]: 'f'

最大值是f而不是43.0,因为在CPython2中,

In [11]: 'f' > 43.0
Out[11]: True

在CPython2中,不同类型的对象…按其类型名称排序。因此,任何str都比自'str' > 'int'以来的任何int都大。
在Python3中,字符串和int的比较会引发TypeError
若要仅在数值列中查找最大值,请使用

df.select_dtypes(include=[np.number]).max()
aelbi1ox

aelbi1ox2#

最简单的答案如下。答:

df.max(numeric_only=True).max()

说明:
series = df.max()为您提供一个包含每列最大值的Series。
因此,series.max()为整个 Dataframe 提供了最大值。
当涉及字符串时,numeric_only是必需的;正如@unutbu的回答所指出的,OP的问题的结果在python 2中将是f,在python 3中将是TypeError

z0qdvdin

z0qdvdin3#

另一种方法:

df.melt().value.max()

本质上,melt()将DataFrame转换为一个长列。

mm5n2pyu

mm5n2pyu4#

使用numpy max

np.max(df.values)

np.nanmax(df.values)

或者在Pandas身上

df.values.max()
xqkwcwgp

xqkwcwgp5#

对于最大值,检查以前的答案。。对于值的最大值,使用例如:

val_cols = [c for c in df.columns if c.startswith('val')]
print df[val_cols].max()
nfzehxib

nfzehxib6#

可以通过以下两个步骤找到Max:

maxForRow = allData.max(axis=0) #max for each row
globalMax = maxForRow.max(); #max across all rows
f45qwnt8

f45qwnt87#

This answer可能最适合一般情况,但如果您需要速度,并且您的值仅限于已知列,则首先指定您的列将使用更少的CPU周期。例如:

df[['value1', 'value2']].max(numeric_only=True).max()

如果已知指定的列仅包含数字,则可以删除numeric_only

相关问题