Pab
Pab

Reputation: 1052

Take derivative of dataframe

I want to take the derivative of a dataframe row-wise. This is simply the difference: df_derived(i,j) = df(i,j)- df(i,j-1). Dataframe given below:

    GRD1    GRD2    GRD3    GRD4    GRD5    GRD6    GRD7
0   1       6       5.0     9.0     1.0     7.0     9
1   5       8       NaN     8.0     NaN     NaN     2
2   7       8       NaN     NaN     NaN     2.0     6

I am looking for:

    GRD1    GRD2    GRD3    GRD4    GRD5    GRD6    GRD7
0   NaN     5.0     -1      4.0     -8.0    6.0     2.0
1   NaN     3.0     NaN     NaN     NaN     NaN     NaN
2   NaN     1.0     NaN     NaN     NaN     NaN     4.0

But when I do: df.apply('diff',axis=1), result is different:

    GRD1    GRD2    GRD3    GRD4    GRD5    GRD6    GRD7
0   NaN     5.0     NaN     4.0     -8.0    6.0     3.0
1   NaN     3.0     NaN     NaN     NaN     NaN     -6.0
2   NaN     1.0     NaN     NaN     NaN     NaN     -2.0

Notice column GR3 and GRD7 are different. How to do this?

Upvotes: 2

Views: 387

Answers (2)

BENY
BENY

Reputation: 323356

Let us try numpy diff

df[:]=np.hstack([np.ones((len(df),1))*np.nan,np.diff(df.values)])
df
   GRD1  GRD2  GRD3  GRD4  GRD5  GRD6  GRD7
0   NaN   5.0  -1.0   4.0  -8.0   6.0   2.0
1   NaN   3.0   NaN   NaN   NaN   NaN   NaN
2   NaN   1.0   NaN   NaN   NaN   NaN   4.0

Upvotes: 3

Andy L.
Andy L.

Reputation: 25269

Try cast all columns to float

df_final = df.astype(float).diff(axis=1)

Out[65]:
   GRD1  GRD2  GRD3  GRD4  GRD5  GRD6  GRD7
0   NaN   5.0  -1.0   4.0  -8.0   6.0   2.0
1   NaN   3.0   NaN   NaN   NaN   NaN   NaN
2   NaN   1.0   NaN   NaN   NaN   NaN   4.0

Upvotes: 2

Related Questions