Home > Mobile >  Pandas dataframe conditional interpolation on a specific variable
Pandas dataframe conditional interpolation on a specific variable

Time:10-14

continuing from my last question

Supposed that I expanded my dataframe to something that looks like this

import pandas as pd
import numpy as np

na = np.nan

df = pd.DataFrame({
    'location' : ['a','a','a','a','a','b','b','b','b','b'],
    'temp' : [11.6,12.2,na,12.4,12.9,na,17.6,17.4,17.2,16.8],
    'precip': [0.22,0.22,0.24,na,0.27,0.33,na,0.34,0.34,0.37]
})

And I only want to fill out missing temp values on location a. I tried something like this

df[df['location'] == 'a']['temp'] = df[df['location'] == 'a']['temp'].interpolate()

And it giving me this error

<string>:12: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
location  temp  precip
0        a  11.6    0.22
1        a  12.2    0.22
2        a   NaN    0.24
3        a  12.4     NaN
4        a  12.9    0.27
5        b   NaN    0.33
6        b  17.6     NaN
7        b  17.4    0.34
8        b  17.2    0.34
9        b  16.8    0.37

Any help or reference would be appreciated. Thank you

CodePudding user response:

Use DataFrame.loc:

m = df['location'] == 'a'
df.loc[m, 'temp'] = df.loc[m, 'temp'].interpolate()

Your solution (slowier if large df, because 2 times created mask):

df.loc[df['location'] == 'a', 'temp'] = df.loc[df['location'] == 'a', 'temp'].interpolate()

CodePudding user response:

You can use update to modify values in place.

df.update(df.loc[df['location'] == 'a', 'temp'].interpolate())
print(df)

# Output:
  location  temp  precip
0        a  11.6    0.22
1        a  12.2    0.22
2        a  12.3    0.24
3        a  12.4     NaN
4        a  12.9    0.27
5        b   NaN    0.33
6        b  17.6     NaN
7        b  17.4    0.34
8        b  17.2    0.34
9        b  16.8    0.37
  • Related