Search code examples
pandasdataframenanbroadcasting

pandas dataframe subtraction causing nan


I have a pandas dataframe:

>>> 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

I create the mean of first differences along each row:

>>> 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

Then if i try to subtract this mean from each value, I get all nans:

>>> (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

different way of subtraction

>>> ((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

I get same results on using mu[:,] instead of mu

Is there a way to fix this?


Solution

  • You need sub with axis=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