Home > Blockchain >  I want to use values from dataframeA as upper and lower bounds to filter dataframeB
I want to use values from dataframeA as upper and lower bounds to filter dataframeB

Time:02-16

I have two dataframes A and B.

Dataframe A has 4 columns with 2 sets of maximum and minimums that I want to use as upper and lower bounds for 2 columns in dataframe B.

latitude = data['y']
longitude = data['x']

upper_lat = coords['lat_max']
lower_lat = coords['lat_min']
upper_lon = coords['long_max']
lower_lon = coords['long_min']


def filter_data_2(filter, upper_lat, lower_lat, upper_lon, lower_lon, lat, lon):
    v = filter[(lower_lat <= lat <= upper_lat ) & (lower_lon <= lon <= upper_lon)]

    return v

newdata = filter_data_2(data, upper_lat, lower_lat, upper_lon, lower_lon, latitude, longitude)


ValueError: Can only compare identically-labeled Series objects

CodePudding user response:

MWE:

import pandas as pd

a = {'lower_lon': [2,4,6], 'upper_lon': [4,6,10], 'lower_lat': [1,3,5], 'upper_lat': [3,5,7]}
constraints = pd.DataFrame(data=a)

constraints


     lower_lon  upper_lon   lower_lat   upper_lat
0         2          4          1           3
1         4          6          3           5
2         6          10         5           7




b = {'lon' : [3, 5, 7, 9, 11, 13, 15], 'lat': [2, 4, 6, 8, 10, 12, 14]}
to_filter = pd.DataFrame(data=b)

to_filter


   lon  lat
0   3    2
1   5    4
2   7    6
3   9    8
4   11   10
5   13   12
6   15   14


lat = to_filter['lat']
lon = to_filter['lon']

lower_lon = constraints['lower_lon']
upper_lon = constraints['upper_lon']
lower_lat = constraints['lower_lat']
upper_lat = constraints['upper_lat']



v = to_filter[(lower_lat <= lat) & (lat <= upper_lat) & (lower_lon <= lon) & (lon <= upper_lon)]

Expected Results

v

   lon  lat
0   3    2
1   5    4
2   7    6

CodePudding user response:

The global filter will be the union of the sets of all the contraints, in pandas you could:

v = pd.DataFrame()
for i in constraints.index:
      # Current constraints 
      min_lon, max_lon, min_lat, max_lat = constraints.loc[i, :]

      # Apply filter 
      df = to_filter[ (to_filter.lon>= min_lon & to_filter.lon<= max_lon) & (to_filter.lat>= min_lat & to_filter.lat<= max_lat) ]

      # Join in a single df previous and current filter outcome
      v= pd.concat( [v, df] )

# Remove duplicates, if any 
v = v.drop_duplicates()
  • Related