Присоединить столбец из одного фрейма данных к другому, если значение col от 1 находится в пределах диапазона значений, заданных в другом

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

Существует два фрейма данных:

 df1 = pd.DataFrame({'year':[2000, 2001, 2002], 'city':['NY', 'AL', 'TX'], 'zip':[100, 200, 300]})  
df2 = pd.DataFrame({'year':[2000, 2001, 2002], 'city':['NY', 'AL', 'TX'], 'zip':["95-150", "160-220", "190-310"], 'value':[10, 20, 30]}) 
 

Основным df является df1, и я хочу добавить столбец «значение» из df2 в df1 на основе соответствующего года, города и почтового индекса. Проблема в том, что zip-файл df2 задан в диапазоне, и я хочу прикрепить «значение», только если zip-файл df1 находится в пределах заданного диапазона. Я не уверен, как это сделать. Я пробовал несколько вещей, таких как:

 # Match indices so that new cols will attach when equal indices
df1 = df1.set_index(['year', 'city'])
df2 = df2.set_index(['year', 'city'])

# Split range of zip into a list
df2['zip'] = df2['zip'].str.split("-")

# Attach 'value' to df1 if df1's zip if greater than df2's min zip AND less than df2's max zip
df1['value'] = df2.loc[(df2['zip'].str[0].astype(int) <= df1['zip']) amp; 
                       (df2['zip'].str[1].astype(int) >= df1['zip']), 'value']

 

Что дает мне эту ошибку: ошибка значения: можно сравнивать только объекты серии с одинаковыми метками

Ответ №1:

Разделите и убедитесь, что их int

df2[['start', 'end']] = df2['zip'].str.split('-', expand=True).astype(int)

Используйте Series.between

 df1['value'] = df1['zip'].between(df2['start'], df2['end'])

   year city  zip  value
0  2000   NY  100   True
1  2001   AL  200   True
2  2002   TX  300   True

 

Комментарии:

1. Спасибо за ответ. Это дает мне эту ошибку даже после сортировки обоих индексов «Ошибка значения: можно сравнивать только объекты серии с одинаковыми метками» также, как вы получаете значение df1 равным столбцу «значение» df2?

2. убедитесь, что все dtypes являются int . Чтобы получить значения из df2 в df1, вы можете объединить [year, city]