If I have a dataframe with some index and some value as follows:

```
import pandas as pd
from random import random
my_index = []
my_vals = []
for i in range(1000):
my_index.append(i+random())
my_vals.append(random())
df_vals = pd.DataFrame({'my_index': my_index, 'my_vals': my_vals})
```

And I have a second dataframe with a column `start`

and `end`

, a row must be read as an interval, so the first row would be interval from `1`

to `4`

(including 1 and 4). It is the following dataframe:

```
df_intervals = pd.DataFrame({'start': [1, 7, 54, 73, 136, 235, 645, 785, 968], 'end': [4, 34, 65, 90, 200, 510, 700, 805, 988]})
```

I would like to make all values in the `my_vals`

column of `df_vals`

a `NaN`

if the row’s index (`my_index`

) does not fall in to one of the intervals specified in the `df_intervals`

dataframe. What is the best way to go about this automatically rather than specifying each condition manually?

(In my actual data set there are more than 9 intervals, this is some example data)

EDIT: in my actual data these indeces are not strictly integers, these can also be random floats

### >Solution :

I believe this is a possible solution,

```
def index_in_range(index, df):
for index_, row in df.iterrows():
if (index >= row['start']) and (index <= row['end']):
return True
return False
df_vals['my_vals'] = df_vals.apply(lambda row: row['my_vals'] if index_in_range(row['my_index'], df_intervals) else None, axis=1)
```

To accomplish this without using a `lambda`

function, you can do the following,

```
def index_in_range(index, df):
for index_, row in df.iterrows():
if (index >= row['start']) and (index <= row['end']):
return True
return False
for index_, row in df_vals.iterrows():
if not index_in_range(row['my_index'], df_intervals):
df_vals.at[index_, 'my_vals'] = None
```

Output:

```
my_index my_vals
0 0 NaN
1 1 0.126647
2 2 0.769215
3 3 0.819891
4 4 0.674466
... ... ...
995 995 NaN
996 996 NaN
997 997 NaN
998 998 NaN
999 999 NaN
```