【问题标题】:pandas dataframe subtraction causing nanpandas 数据帧减法导致 nan
【发布时间】:2017-03-02 05:24:36
【问题描述】:

我有一个熊猫数据框:

>>> X_df.shape
Out[35]: (177, 2762)
>>> X_df.ix[0:5,1000:1005]
Out[40]: 
              1000    1001    1002    1003    1004    1005
2016-01-04 119.225     nan     nan     nan     nan     nan
2016-01-05 119.225 119.189 119.177 119.160 119.203 119.220
2016-01-06 119.175 119.175     nan 119.204 119.208 119.221
2016-01-07 118.532     nan 118.542 118.529     nan 118.534
2016-01-08 117.861 117.820 117.762     nan 117.686 117.709

我在每一行创建一阶差分的平均值:

>>> mu = (X_df.diff(1,axis=1)).mean(axis=1)
>>> mu.head()
Out[42]: 
2016-01-04   -0.001
2016-01-05   -0.001
2016-01-06   -0.000
2016-01-07   -0.000
2016-01-08   -0.000
dtype: float64

然后,如果我尝试从每个值中减去这个平均值,我会得到所有的 nan:

>>> (X_df.diff(1,axis=1)-mu).ix[0:5,1000:1005]
Out[51]: 
            1000  1001  1002  1003  1004
2016-01-04   nan   nan   nan   nan   nan
2016-01-05   nan   nan   nan   nan   nan
2016-01-06   nan   nan   nan   nan   nan
2016-01-07   nan   nan   nan   nan   nan
2016-01-08   nan   nan   nan   nan   nan

不同的减法

>>> ((X_df.diff(1,axis=1).subtract(mu,axis=1))).ix[0:5,1000:1005]
Out[52]: 
            1000  1001  1002  1003  1004
2016-01-04   nan   nan   nan   nan   nan
2016-01-05   nan   nan   nan   nan   nan
2016-01-06   nan   nan   nan   nan   nan
2016-01-07   nan   nan   nan   nan   nan
2016-01-08   nan   nan   nan   nan   nan

使用mu[:,] 代替mu 得到相同的结果

有没有办法解决这个问题?

【问题讨论】:

    标签: pandas dataframe nan broadcasting


    【解决方案1】:

    你需要subaxis=0

    a = (X_df.diff(1,axis=1))
    print (a)
                1000   1001   1002   1003   1004   1005
    2016-01-04   NaN    NaN    NaN    NaN    NaN    NaN
    2016-01-05   NaN -0.036 -0.012 -0.017  0.043  0.017
    2016-01-06   NaN  0.000    NaN    NaN  0.004  0.013
    2016-01-07   NaN    NaN    NaN -0.013    NaN    NaN
    2016-01-08   NaN -0.041 -0.058    NaN    NaN  0.023
    
    print (a.sub(a.mean(axis=1), axis=0))
    #sub same as subtract, only less typing
    #print (a.subtract(a.mean(axis=1), axis=0))
                1000      1001      1002   1003      1004      1005
    2016-01-04   NaN       NaN       NaN    NaN       NaN       NaN
    2016-01-05   NaN -0.035000 -0.011000 -0.016  0.044000  0.018000
    2016-01-06   NaN -0.005667       NaN    NaN -0.001667  0.007333
    2016-01-07   NaN       NaN       NaN  0.000       NaN       NaN
    2016-01-08   NaN -0.015667 -0.032667    NaN       NaN  0.048333
    

    【讨论】:

    • 是的,我也注意到了..但不明白为什么。 axis=0 不是代表列吗?
    • 不,它用于索引。对于列是默认值axis=1
    • 也许可以帮助this
    • 如果我做 DF.mean(axis=1) ,每个索引都取平均值。按照类似的逻辑,DF.sub(x, axis=1) 应该沿着每个索引减去,对吧?
    • 我理解你的逻辑,但它是关于通过index (axis=0) 或通过列index=1 匹配。
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多