2017-02-14 2 views
2

ВопросValueError: Выдерживает DataFrame с булевыми значениями только

В этом файле данных, Соединенные Штаты разбиты на четыре области с использованием колонки «РЕГИОН».

Создайте запрос, который находит уезды, которые принадлежат к регионам 1 или 2, название которого начинается с «Вашингтон», и чьи POPESTIMATE2015 было больше, чем их POPESTIMATE 2014.

Эта функция должна возвращать 5x2 DataFrame с столбцы = ['STNAME', 'CTYNAME'] и тот же идентификатор индекса, что и census_df (отсортировано по возрастанию по индексу).

КОД

def answer_eight(): 
    counties=census_df[census_df['SUMLEV']==50] 
    regions = counties[(counties[counties['REGION']==1]) | (counties[counties['REGION']==2])] 
    washingtons = regions[regions[regions['COUNTY']].str.startswith("Washington")] 
    grew = washingtons[washingtons[washingtons['POPESTIMATE2015']]>washingtons[washingtons['POPESTIMATES2014']]] 
    return grew[grew['STNAME'],grew['COUNTY']] 

outcome = answer_eight() 
assert outcome.shape == (5,2) 
assert list (outcome.columns)== ['STNAME','CTYNAME'] 
print(tabulate(outcome, headers=["index"]+list(outcome.columns),tablefmt="orgtbl")) 

ОШИБКА

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-77-546e58ae1c85> in <module>() 
     6  return grew[grew['STNAME'],grew['COUNTY']] 
     7 
----> 8 outcome = answer_eight() 
     9 assert outcome.shape == (5,2) 
    10 assert list (outcome.columns)== ['STNAME','CTYNAME'] 

<ipython-input-77-546e58ae1c85> in answer_eight() 
     1 def answer_eight(): 
     2  counties=census_df[census_df['SUMLEV']==50] 
----> 3  regions = counties[(counties[counties['REGION']==1]) | (counties[counties['REGION']==2])] 
     4  washingtons = regions[regions[regions['COUNTY']].str.startswith("Washington")] 
     5  grew = washingtons[washingtons[washingtons['POPESTIMATE2015']]>washingtons[washingtons['POPESTIMATES2014']]] 

/opt/conda/lib/python3.5/site-packages/pandas/core/frame.py in __getitem__(self, key) 
    1991    return self._getitem_array(key) 
    1992   elif isinstance(key, DataFrame): 
-> 1993    return self._getitem_frame(key) 
    1994   elif is_mi_columns: 
    1995    return self._getitem_multilevel(key) 

/opt/conda/lib/python3.5/site-packages/pandas/core/frame.py in _getitem_frame(self, key) 
    2066  def _getitem_frame(self, key): 
    2067   if key.values.size and not com.is_bool_dtype(key.values): 
-> 2068    raise ValueError('Must pass DataFrame with boolean values only') 
    2069   return self.where(key) 
    2070 

ValueError: Must pass DataFrame with boolean values only 

Я невежественный. Где я иду не так?

Благодаря

+0

это неправильно 'графств [census_df [«РЕГИОН»] == 1]' вы пытаетесь использовать другой ФР маскировать вам следует использовать тот же ФР : 'counties [counties ['REGION'] == 1]' или маскировать родительский df только 'census_df [census_df ['REGION'] == 1]' – EdChum

+0

Спасибо @EdChum, но я попытался внести изменения. Эта же ошибка появляется снова! –

+0

Редактируйте свой вопрос с обновленными попытками, заметьте, я заявляю, что вы не должны использовать другую форму df для маскировки другого df – EdChum

ответ

2

Вы пытаетесь использовать другой ФР профилированного маскировать свой Д.Ф., это неправильно, кроме того, как вы передаете условие используются неправильно. Когда вы сравниваете столбец или серию в df со скаляром для создания булевой маски, вы должны просто передать это условие, а не использовать это последовательно.

def answer_eight(): 
    counties=census_df[census_df['SUMLEV']==50] 
    # this is wrong you're passing the df here multiple times 
    regions = counties[(counties[counties['REGION']==1]) | (counties[counties['REGION']==2])] 
    # here you're doing it again 
    washingtons = regions[regions[regions['COUNTY']].str.startswith("Washington")] 
    # here you're doing here again also 
    grew = washingtons[washingtons[washingtons['POPESTIMATE2015']]>washingtons[washingtons['POPESTIMATES2014']]] 
    return grew[grew['STNAME'],grew['COUNTY']] 

вы хотите:

def answer_eight(): 
    counties=census_df[census_df['SUMLEV']==50] 
    regions = counties[(counties['REGION']==1]) | (counties['REGION']==2])] 
    washingtons = regions[regions['COUNTY'].str.startswith("Washington")] 
    grew = washingtons[washingtons['POPESTIMATE2015']>washingtons['POPESTIMATES2014']] 
    return grew[['STNAME','COUNTY']] 
Смежные вопросы