#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]