Skip to content
Advertisement

Adding a value to a column in a DataFrame depending on a value in another column

I have a DataFrame with multiple columns.

    base_rate weighting_factor  index_1  
0         NaN                         0  
1    1.794836                         1  
2    1.792804                         2  
3    1.795893                         3  
4    1.798023                         4  
5    1.795517                         5  
6    1.798652                         6  
7    1.794425                         7  
8    1.796899                         8 

The column

weighting_factor

is empty. Now I want to append values to that column row by row, if the value of

index_1

lies between specific integer boarders.

I tried

if df['index1'] <= oldest_max:
    werte_df["weighting_factor"].append(wf_tooold)

whereas wf_tooold is a float and oldest_max is an int.

The error that I get is

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

What would be a good way to fill in the value in the corresponding column?

Code sample to initialize a dataframe:

d = {'index_1': [1,2,3,4,5,6,7,8,9,10,11,12]}
df = pd.DataFrame(data=d)
df["weighting_factor"]= ""

Advertisement

Answer

You basically want to update a filtered number of rows with a value, so you do that with:

df.loc[df['index_1'] <= oldest_max, 'weighting_factor'] = wf_toold

for example with oldest_max = 4 and wf_toold = 14.25, we get:

>>> df
    index_1 weighting_factor
0         1            14.25
1         2            14.25
2         3            14.25
3         4            14.25
4         5                 
5         6                 
6         7                 
7         8                 
8         9                 
9        10                 
10       11                 
11       12

It might however be better to give weighting_factor a NaN as starting value, otherwise pandas will see the weighting_factor as a Series of objects, not floats:

from numpy import NaN
df['weighting_factor']= NaN

you can check between a lower bound and an upperbound with:

df.loc[df['index_1'].between(old_min, oldest_max), 'weighting_factor'] = wf_toold
Advertisement