首页 > 解决方案 > 为什么 numpy max 函数(np.max)返回错误的输出?

问题描述

我有pandas DataFrame,我把它变成了。我在我的 DataFrame 中为一列numpy ndarray使用函数,如下所示:max

print('column: ',df[:,3])
print('max: ',np.max(df[:,3]))

输出是:

column: [0.6559999999999999 0.48200000000000004 0.9990000000000001 ..., 1.64 nan 0.07]
max: 0.07

但正如您所看到的,例如第一个值大于 0.07!问题是什么?

标签: pythonpandasnumpy

解决方案


这里有两个问题



  1. 看起来您正在尝试查找最大值的列具有数据类型object。如果您确定列应该包含数字数据,则不建议这样做,因为它不仅在这种特殊情况下可能会导致不可预测的行为。请检查您的数据框的数据类型(您可以通过键入来执行此操作df.dtypes)并更改它以使其与您期望的数据相对应(对于这种情况df[column_name].astype(np.float64))。这也是np.nanmax不能正常工作的原因。

  2. 您不想np.max在包含 nans 的数组上使用。



解决方案



  1. 如果您确定object列的数据类型:

    1.1。您可以使用 Series 的 max 方法,它应该自动将数据转换为浮动。

    df.iloc[3].max()

    1.2. 您只能为 nanmax 函数将数据转换为适当的类型。

    np.nanmax(df.values[:,3].astype(np.float64)

    1.3 您可以从数据框中删除所有 nan 并找到 max[不推荐]:

    np.max(test_data[column_name].dropna().values)
    

  1. 如果您的数据类型是 float64 并且它不应该是object数据类型 [推荐]:

    df[column_name] = df[column_name].astype(np.float64)
    
    np.nanmax(df.values[:,3])
    


说明问题的代码



#python
import pandas as pd
import numpy as np 

test_data = pd.DataFrame({
                   'objects_column': np.array([0.7,0.5,1.0,1.64,np.nan,0.07]).astype(object),
                   'floats_column': np.array([0.7,0.5,1.0,1.64,np.nan,0.07]).astype(np.float64)})

print("********Using np.max function********")
print("Max of objects array:", np.max(test_data['objects_column'].values))
print("Max of floats array:", np.max(test_data['floats_column'].values))

print("\n********Using max method of series function********")
print("Max of objects array:", test_data["objects_column"].max()) 
print("Max of floats array:", test_data["objects_column"].max()) 

回报:

********Using np.max function********
Max of objects array: 0.07
Max of floats array: nan

********Using max method of series function********
Max of objects array: 1.64
Max of floats array: 1.64

推荐阅读