【问题标题】:Adding two Series with NaNs使用 NaN 添加两个系列
【发布时间】:2021-09-07 00:49:19
【问题描述】:

我正在研究“用于数据分析的 Python”,但我不了解特定功能。添加两个 pandas 系列对象将自动对齐索引数据,但如果一个对象不包含该索引,则返回为 NaN。例如从书中:

a = Series([35000,71000,16000,5000],index=['Ohio','Texas','Oregon','Utah'])
b = Series([NaN,71000,16000,35000],index=['California', 'Texas', 'Oregon', 'Ohio'])

结果:

    In [63]: a
    Out[63]: Ohio          35000
             Texas         71000
             Oregon        16000
             Utah           5000
    In [64]: b
    Out[64]: California      NaN
             Texas         71000
             Oregon        16000
             Ohio          35000

当我把它们加在一起时,我得到了这个......

    In [65]: a+b
    Out[65]: California       NaN
             Ohio           70000
             Oregon         32000
             Texas         142000
             Utah             NaN

那么为什么犹他值是 NaN 而不是 500?似乎 500+NaN=500。是什么赋予了?我遗漏了一些东西,请解释一下。

更新:

    In [92]: # fill NaN with zero
             b = b.fillna(0)
             b
    Out[92]: California        0
             Texas         71000
             Oregon        16000
             Ohio          35000

    In [93]: a
    Out[93]: Ohio      35000
             Texas     71000
             Oregon    16000
             Utah       5000

    In [94]: # a is still good
             a+b
    Out[94]: California       NaN
             Ohio           70000
             Oregon         32000
             Texas         142000 
             Utah             NaN

【问题讨论】:

  • 已解决:'+' 运算符执行两者的并集。我需要 .add() 方法。

标签: python pandas


【解决方案1】:

Pandas 不假设 500+NaN=500,但很容易要求它这样做:

a.add(b, fill_value=0)

【讨论】:

  • 既然你提到了这本书,你可以参考第128页的“算术和数据对齐”部分,其中谈到了这一点。
  • Ahhhh... '+' 返回两者的 union!我需要 add() 方法。太棒了,谢谢@dbiamante @DanAllen!
【解决方案2】:

默认方法是假设任何涉及 NaN 的计算都会给出 NaN 作为结果。任何加上 NaN 的都是 NaN,任何除以 NaN 的都是 NaN,等等。如果你想用一些值填充 NaN,你必须明确地这样做(正如 Dan Allan 在他的回答中所展示的那样)。

【讨论】:

    【解决方案3】:

    使用pd.concat() 更有意义,因为它可以接受更多列。

    import pandas as pd
    import numpy as np
    
    a = pd.Series([35000,71000,16000,5000],index=['Ohio','Texas','Oregon','Utah'])
    b = pd.Series([np.nan,71000,16000,35000],index=['California', 'Texas', 'Oregon', 'Ohio'])
    
    pd.concat((a,b), axis=1).sum(1, min_count=1)
    

    输出:

    California         NaN
    Ohio           70000.0
    Oregon         32000.0
    Texas         142000.0
    Utah            5000.0
    dtype: float64
    

    或与 3 系列:

    import pandas as pd
    import numpy as np
    
    a = pd.Series([1, np.NaN, 4, 5])
    b = pd.Series([3, np.NaN, 5, np.NaN])
    c = pd.Series([np.NaN,np.NaN,np.NaN,np.NaN])
    
    print(pd.concat((a,b,c), axis=1).sum(1, min_count=1))
    
    #0    4.0
    #1    NaN
    #2    9.0
    #3    5.0
    #dtype: float64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2014-12-30
      • 2018-07-25
      • 1970-01-01
      • 2012-07-02
      • 2019-04-26
      相关资源
      最近更新 更多