stevendesu
stevendesu

Reputation: 16841

Pandas: Trouble Updating Rows Conditionally

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

Desired Final Output

>>>df
     rtt   requests
asn  
1000 40    100
2000 50    NaN
3000 60    300

Upvotes: 2

Views: 40

Answers (3)

Scott Boston
Scott Boston

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

Vaishali
Vaishali

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

Zero
Zero

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

Related Questions