Reputation: 16841
I have the following DataFrame:
>>>df
rtt requests
asn
1000 4000 100
2000 50 NaN
3000 18000 300
My goal is to divide rtt
by requests
in place if requests
is not NaN
, otherwise leave rtt
untouched. I've tried various things and either the second row gets set to NaN
like so:
>>>df
rtt requests
asn
1000 40 100
2000 NaN NaN
3000 60 300
Or the DataFrame isn't updated at all
>>>df
rtt requests
asn
1000 40 100
2000 50 NaN
3000 60 300
Upvotes: 2
Views: 40
Reputation: 153510
Use, div
with fill_value=1
:
df.assign(rtt = df.rtt.div(df.requests, fill_value=1))
Output:
rtt requests
asn
1000 40.0 100.0
2000 50.0 NaN
3000 60.0 300.0
Upvotes: 1
Reputation: 38415
Or using np.where
df['rtt'] = np.where(df['requests'].notnull(), df['rtt']/df['requests'], df['rtt'])
rtt requests
asn
1000 40.0 100.0
2000 50.0 NaN
3000 60.0 300.0
Upvotes: 1
Reputation: 77017
Use fillna
In [1889]: df['rtt'] = df['rtt'].div(df['requests']).fillna(df['rtt'])
In [1890]: df
Out[1890]:
rtt requests
asn
1000 40.0 100.0
2000 50.0 NaN
3000 60.0 300.0
Or, /
instead of div
In [1895]: (df['rtt'] / df['requests']).fillna(df['rtt'])
Out[1895]:
asn
1000 40.0
2000 50.0
3000 60.0
dtype: float64
Or, combine_first
In [1897]: df['rtt'].div(df['requests']).combine_first(df['rtt'])
Out[1897]:
asn
1000 40.0
2000 50.0
3000 60.0
dtype: float64
Upvotes: 1