Python Pandas的min()函数无法找到最小值

5

我遇到了一个奇怪的问题。我相信这背后有一个逻辑原因。

我有一个名为alloptions的数据框,它有4列,minage1、minage2、minage3和minage4,它们都是float64类型。缺失值的数量从minage1到minage4逐渐增加。

我创建了第五列,它取这四列中的最小值:

alloptions['minage']=alloptions.apply(lambda x: min([x['minage1'],x['minage2'],x['minage3'],x['minage4']]),axis=1)

这似乎是有效的,直到我发现在第47行有问题。

     minage1    minage2 minage3 minage4 minage      
47     NaN      56.0    NaN      NaN     NaN

使用 .loc,我将行数据隔离:

In [10]:

 print alloptions.loc[47,:]
 print alloptions.loc[47,:].dtypes

I get

minage1   NaN
minage2    56
minage3   NaN
minage4   NaN
minage    NaN
Name: 47, dtype: float64
float64

我有些困惑为什么这个函数没有识别出56。

在此提前感谢您的帮助。

1个回答

7

您正在使用Python内置的min函数,它不了解nan并会处理不一致:

>>> min(1, np.nan)
1
>>> min(np.nan, 1)
nan

不要使用Python内置的min方法,因为它无法忽略nan值。而是使用来自pandasmin方法,它在计算最小值时会忽略nan值。该方法接受一个axis参数,因此如果您的DataFrame中只有四个minageX列,那么您只需执行以下操作:

df['minage'] = df.min(axis=1)

通常在使用pandas数据结构时,应避免使用内置的Python函数比如max、min、sum等,而是使用pandas提供的版本;内置函数不了解pandas或矢量化操作,可能会产生意外结果。


谢谢,你的答案解决了我的问题,对我很有用! - chungkim271
1
@chungkim271 如果这个回答解决了你的问题,你应该将其标记为已接受(点击后变成绿色的复选标志)。 - Paul H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接