ValueError: Trebuie să transmiteți DataFrame numai cu valori booleene (Programare, Python, Bază De Date, Pandas, Știința Datelor)

Umang Mistry a intrebat.
a intrebat.

Întrebare

În acest fișier de date, Statele Unite sunt împărțite în patru regiuni cu ajutorul coloanei „REGION”.

Creați o interogare care să găsească județele care aparțin regiunilor 1 sau 2, al căror nume începe cu „Washington” și al căror POPESTIMATE2015 a fost mai mare decât POPESTIMATE 2014.

Această funcție ar trebui să returneze un DataFrame 5×2 cu coloanele = [„STNAME”, „CTYNAME”] și același ID de index ca și census_df (sortat crescător în funcție de index).

COD

    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"))

ERROR

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

Nu am nici o idee. Unde greșesc?

Mulțumesc

6 răspunsuri
EdChum

Încerci să folosești un df de formă diferită pentru a masca df-ul tău, acest lucru este greșit, în plus, modul în care treci condițiile este utilizat incorect. Atunci când comparați o coloană sau o serie dintr-un df cu un scalar pentru a produce o mască booleană, ar trebui să treceți doar condiția, nu să utilizați acest lucru succesiv.

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

doriți:

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

gourav chatterjee
def answer_eight():
    df=census_df[census_df['SUMLEV']==50]
    #df=census_df
    df=df[(df['REGION']==1) | (df['REGION']==2)]
    df=df[df['CTYNAME'].str.startswith('Washington')]
    df=df[df['POPESTIMATE2015'] > df['POPESTIMATE2014']]
    df=df[['STNAME','CTYNAME']]
    print(df.shape)
    return df.head(5)

Comentarii

  • Vă rugăm să adăugați o explicație la răspunsul dvs. pentru a-i ajuta pe cursanți să îl înțeleagă. Răspunsurile numai cu cod nu sunt întotdeauna clare și sunt considerate nepoliticoase. Folosiți funcția de editare pentru îmbunătățire, –  > Por Brian Tompsett – 汤莱恩.
yoghini

def answer_eight():
    county = census_df[census_df['SUMLEV']==50]
    req_col = ['STNAME','CTYNAME']

    region = county[(county['REGION']<3) & (county['POPESTIMATE2015']>county['POPESTIMATE2014']) & (county['CTYNAME'].str.startswith('Washington'))]
    region = region[req_col]

    return region
answer_eight()

Jay Mulani
def answer_eight():
    df=census_df
    region1=df[ df['REGION']==1 ]
    region2=df[ df['REGION']==2 ]

    yes_1=region1[ region1['POPESTIMATE2015'] > region1['POPESTIMATE2014']]
    yes_2=region2[ region2['POPESTIMATE2015'] > region2['POPESTIMATE2014']]

    yes_1=yes_1[ yes_1['CTYNAME']=='Washington County' ]
    yes_2=yes_2[ yes_2['CTYNAME']=='Washington County' ]

    ans=yes_1[ ['STNAME','CTYNAME'] ]  
    ans=ans.append(yes_2[ ['STNAME','CTYNAME'] ])
    return ans.sort()

Comentarii

  • Simplu și ușor –  > Por Jay Mulani.
CabantingDave

Am rezolvat problema la Coursera astfel.

def answer_eight():
    df8 = census_df.copy()
    washington = df8['CTYNAME'].str[0:10] == 'Washington'
    popincrease = df8['POPESTIMATE2015']) > (df8['POPESTIMATE2014']
    region = (df8['REGION'] == 1) | (df8['REGION'] == 2)
    
df8 = df8[region & popincrease & washington]

    return df8[{'STNAME','CTYNAME'}]

answer_eight()

Eram începător în Pandas pe atunci și mi-a luat aproape 20 de LOL-uri.

Melwin Varghese

Am rezolvat-o în acest fel (Nu am folosit nici o variabilă locală accesată direct census_df într-o singură linie)Soluția este cam la fel ca și celelalte soluții pe care le vedeți, dar în celelalte soluții, au folosit variabilele locale în soluțiile mele nu le-am folosit.

def answer_eight(): 
    return census_df[
          (census_df['SUMLEV'] == 50)                                     &
          ((census_df["REGION"] == 1) | (census_df["REGION"] == 2))       &
          (census_df["CTYNAME"].str.lower()).str.startswith('washington') &
          (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])        
         ][["STNAME","CTYNAME"]]

Comentarii

  • dacă ați putea oferi o explicație pentru răspunsul dvs. ar fi de ajutor. –  > Por Gray_Rhino.
  • Aceste explicații sunt în regulă ? –  > Por Melwin Varghese.