通过包含NaN元素的pandas DataFrame按列查找最小值

时间:2018-08-13 17:08:37

标签: python pandas numpy dataframe nan

我正在尝试获取两个print("Welcome to the math quiz game!") for i in range(0,10): operators = ['+','-','*','/'] import random num1 = random.randint(1,10) num2 = random.randint(1,10) randop = random.choice(operators) question = input("What is %d %s %d: " % (num1,randop,num2)) if randop == "+": answer = num1 + num2 elif randop == "-": answer = num1 - num2 elif randop == "*": answer = num1 * num2 elif randop == "/": answer = num1 / num2 if question == answer: print("\nCorrect") elif question != answer: print("Incorrect or Invalid") pandas之间的最小值。碰巧该系列中的某些元素是Series,当我将其与数字进行比较时,我想得到结果NaN

为什么我使用了NaN函数

我使用了np.min函数。这是因为我知道使用np.min函数会导致错误,因为列表中存在min元素时,输出取决于列表中的顺序。

当我跑步时:

NaN

我得到的结果是:

import numpy as np
print min([1,np.nan])
print min([np.nan,1])

当我跑步时:

>>> 
1
nan

我得到了我期望的结果:

import numpy as np
print np.min([np.nan,1])
print np.min([1,np.nan])

用于在两个>>> nan nan 系列之间寻找最小值的玩具示例代码

考虑到以前的结果,我使用了pandas函数。但是,如果我用两个np.min跟随玩具示例代码,创建一个Series并找到最小值,那么我得到的是数字而不是DataFrame,正如我在NaN和数字进行比较。

NaN

这将导致以下打印结果:

import pandas as pd
import numpy as np
s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([np.nan, np.nan, np.nan, 0, np.nan])
df1 = pd.DataFrame([s1,s2])
df2 = pd.DataFrame([s2,s1])
r1 = np.min(df1,axis=0)
r2 = np.min(df2,axis=0)
print r1
print r2

但是我希望结果与>>> 0 1.0 1 2.0 2 3.0 3 0.0 4 5.0 dtype: float64 0 1.0 1 2.0 2 3.0 3 0.0 4 5.0 dtype: float64 Serie相同,即s2 DataFrame

df1

问题

为两个系列创建的>>> df1 0 1 2 3 4 0 1.0 2.0 3.0 4.0 5.0 1 NaN NaN NaN 0.0 NaN 的最小值时,我是否缺少某个函数或者做错了什么?我希望DataFrame是数字和NaN元素进行比较时的结果...

注意:我将NaNpython 2.7numpy 1.13.3一起使用

2 个答案:

答案 0 :(得分:3)

IIUC,您可以将系列的values作为np.min传递到np.array,并且您会从np.min获得预期的行为:

>>> np.min(df2.values,axis=0)
array([nan, nan, nan,  0., nan])
>>> np.min(df1.values,axis=0)
array([nan, nan, nan,  0., nan])

您还可以将参数skipna=False应用于pands.DataFrame.min,以同时考虑NaN的值:

>>> df1.min(axis=0, skipna=False)
0    NaN
1    NaN
2    NaN
3    0.0
4    NaN
dtype: float64
>>> df2.min(axis=0, skipna=False)
0    NaN
1    NaN
2    NaN
3    0.0
4    NaN
dtype: float64

答案 1 :(得分:1)

IIUC,这是np.minimum

的定义
  

比较两个数组,并返回一个新的包含按元素排列的数组   极小值。 如果要比较的元素之一是NaN,则该元素   。如果两个元素均为NaN,则第一个为   返回。

r1 = np.minimum(df1.loc[0, :], df1.loc[1, :])
r2 = np.minimum(df2.loc[0,:], df2.loc[1, :])