【问题标题】:How do I deal with Pandas Series data type that has NaN?如何处理具有 NaN 的 Pandas 系列数据类型?
【发布时间】:2016-09-03 06:58:16
【问题描述】:

在其中包含 NaN 的 pandas.core.series.Series 类型上使用 max() 和 min() 会发生什么?这是一个错误吗?见下文,


%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

mydata = pd.DataFrame(np.random.standard_normal((100,1)), columns=['No NaN'])
mydata['Has NaN'] = mydata['No NaN'] / mydata['No NaN'].shift(1)

# Both return NaN!
print(min(mydata['Has NaN']), max(mydata['Has NaN']))
# Still why False? Isn't float('nan') a singleton like None?
print(min(mydata['Has NaN']) == max(mydata['Has NaN']))
# But this time works well!
print(min([1, 2, 3, float('nan')]))

print('\n')

# When Series data type that has NaN bumps into min() and max(), what should 
#  I do? E.g.,
try: 
    n, bins, patches = plt.hist(mydata['Has NaN'], 10)
except ValueError as e:
    print(e, '\nSeems "range" argument in hist() has problem!')

【问题讨论】:

    标签: python pandas matplotlib dataframe


    【解决方案1】:

    首先,在处理pandasnumpy 时,不应使用Python 内置的maxmin,尤其是在使用nan 时。

    由于 'nan' 是 mydata['Has NaN'] 的第一项,它在 maxmin 中永远不会被替换,因为(如 docs 中所述):

    非数字值 float('NaN') 和 Decimal('NaN') 是特殊的。 它们与自身相同(x 为 x 为真)但不等于 他们自己(x == x 是假的)。此外,将任何数字与 非数字值将返回 False。例如,两个 3

    改为使用pandas maxmin 方法:

    In [4]: mydata['Has NaN'].min()
    Out[4]: -176.9844930355774
    
    In [5]: mydata['Has NaN'].max()
    Out[5]: 12.684033138603787
    

    关于直方图,这似乎是plt.hist 的一个已知问题,请参阅herehere

    不过,现在处理起来应该相当简单:

    n, bins, patches = plt.hist(mydata['Has NaN'][~mydata['Has NaN'].isnull()], 10)
    

    【讨论】:

    • 很有趣,但为什么plt.hist() 不起作用?如matplotlib docs 中所述,函数 hist() 中的 range 参数默认为 (x.min(), x.max())。所以它应该工作!
    • 顺便说一句,我注意到您提供的 docs 链接直接跳转到相关部分而不是页面顶部。很优雅!您对与链接关联的 URL 做了什么技巧?
    • @Nicholas 抱歉,确实阅读了您关于plt.hist 的原始问题,我认为这实际上是一个错误!查看我的编辑。
    【解决方案2】:

    你应该使用 Pandas 或 NumPy 函数而不是普通的 Python 函数:

    In [7]: mydata['Has NaN'].min(), mydata['Has NaN'].max()
    Out[7]: (-46.00309057827485, 62.430829637766671)
    
    In [8]: min(mydata['Has NaN']), max(mydata['Has NaN'])
    Out[8]: (nan, nan)
    
    In [125]: mydata.plot.hist(alpha=0.5)
    Out[125]: <matplotlib.axes._subplots.AxesSubplot at 0x1a784588>
    

    【讨论】:

    • 谢谢,但为什么plt.hist() 不起作用?如matplotlib docs 中所述,函数 hist() 中的 range 参数默认为 (x.min(), x.max())。所以它应该工作!
    • @Nicholas,您能否定义:why doesn't plt.hist() workpandas.plot.hist 对我来说很好 - 请参阅更新的答案...
    • 您正在使用 pandas 模块。请尝试import matplotlib.pyplot as pltplt.hist()。但我认为 juanpa.arrivillaga 已经发现了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2020-06-27
    相关资源
    最近更新 更多