2017-03-07 6 views
-1
def age_range(age): 
    if age <= 18: 
     return 'Minors' 
    elif age >= 19 & age < 63: 
     return 'Adults' 
    elif age >= 63 & age < 101: 
     return 'Senior Citizen' 
    else: 
     return 'Age Unknown' 

titanic_data_df["PassengerType"] = titanic_data_df[['Age']].apply(age_range, axis = 1) 

titanic_data_df.head() 

bekomme ich folgende Fehlermeldung, wenn ich versuche, eine neue Spalte zu einem vorhandenen Datenrahmen (titanic_data_df) hinzuzufügen:Valueerror während gelten() -Methode

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-466-741f5646101e> in <module>() 
     1 #create a new df with just age and distinguish each passenger as minor, adult or senior citizen 
----> 2 titanic_data_df["PassengerType"] =  titanic_data_df[['Age']].apply(age_range, axis = 1) 
     3 
     4 titanic_data_df.head() 

C:\Users\test\Anaconda2\envs\py27DAND\lib\site-packages\pandas\core\frame.pyc in apply(self, func, axis, broadcast, raw, reduce, args, **kwds) 
    4161      if reduce is None: 
    4162       reduce = True 
-> 4163      return self._apply_standard(f, axis, reduce=reduce) 
    4164    else: 
    4165     return self._apply_broadcast(f, axis) 

C:\Users\test\Anaconda2\envs\py27DAND\lib\site-packages\pandas\core\frame.pyc in _apply_standard(self, func, axis, ignore_failures, reduce) 
    4257    try: 
    4258     for i, v in enumerate(series_gen): 
    -> 4259      results[i] = func(v) 
    4260      keys.append(v.name) 
    4261    except Exception as e: 

<ipython-input-465-e62ccbeee80e> in age_range(age) 
     1 def age_range(age): 
----> 2  if age <= 18: 
     3   return 'Minors' 
     4  elif age >= 19 & age < 63: 
     5   return 'Adults' 

C:\Users\test\Anaconda2\envs\py27DAND\lib\site-packages\pandas\core\generic.pyc in __nonzero__(self) 
    915   raise ValueError("The truth value of a {0} is ambiguous. " 
    916       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 917       .format(self.__class__.__name__)) 
    918 
    919  __bool__ = __nonzero__ 

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 0') 

Von dem, was ich bisher gelesen habe es hat hat etwas mit meiner if ... else-Anweisung in der obigen Methode zu tun. Ich kann nicht herausfinden, was es ist. Jede Hilfe wird geschätzt. Vielen Dank.

+1

Können Sie ein [MCVE] (einschließlich Traceback) zu Ihrer Frage hinzufügen? Es ist schwer herauszufinden, was passiert, wenn wir den Fehler nicht reproduzieren können. – MSeifert

+0

Ist das eine Pandabärenfrage? Fragetags scheinen unvollständig zu sein. –

+1

Ich weiß nicht viel über Pandas, aber ich weiß, dass der bitweise Operator '&' anders als der logische Operator 'and' ist, also besteht eine gute Chance, dass das Problem verursacht wird. Eigentlich, egal - das würde falsche Ergebnisse erzeugen, kein Fehler. – TigerhawkT3

Antwort

1

Wenn Sie eine Spalte als titanic_data_df[['Age']] auswählen (beachten Sie die doppelten eckigen Klammern), erhalten Sie tatsächlich einen DataFrame, der eine einzelne Spalte enthält. In diesem Fall übergibt die Funktion apply() eine einzelne Elementserie an die Funktion age_range.

Versuchen Sie stattdessen:

titanic_data_df["PassengerType"] = titanic_data_df['Age'].apply(age_range) 
+0

Vielen Dank für die Erklärung. Das macht Sinn. Es scheint auch, ich kann auch appylmap() verwenden, wenn ich weiterhin Dataframe anstelle von Serien verwenden möchte. – pyuser181

0

Pandas cut Funktion dieses viel einfacher für Sie machen. Zuerst werde ich einen Datenrahmen konstruieren, um die Funktion zu demonstrieren.

titanic_data_df = pd.DataFrame(data=[[13, 'Male'], [14, 'Female'], [38, 'Female'], [72, 'Male'], [33, 'Female'], [80, 'Male'], [34, 'Male'], [15, 'Female'], [27, 'Female'],[23, 'Male'], [64, 'Female'], [38, 'Female'], [12, 'Male'], [32, 'Female'], [21, 'Male'], [66, 'Male'], [73, 'Female'], [22, 'Female']], columns=['Age', 'Sex']) 
print(titanic_data_df) 
    Age  Sex 
0 13 Male 
1 14 Female 
2 38 Female 
3 72 Male 
4 33 Female 
5 80 Male 
6 34 Male 
7 15 Female 
8 27 Female 
9 23 Male 
10 64 Female 
11 38 Female 
12 12 Male 
13 32 Female 
14 21 Male 
15 66 Male 
16 73 Female 
17 22 Female 

Dann habe ich einfach anwenden, die cut Funktion:

bins = ['Minors', 'Adults', 'Senior Citizens'] 
titanic_data_df["PassengerType"] = pd.cut(titanic_data_df.Age, [0, 18, 63, 101], labels=bins) 
print(titanic_data_df) 
    Age  Sex  PassengerType 
0 13 Male   Minors 
1 14 Female   Minors 
2 38 Female   Adults 
3 72 Male Senior Citizen 
4 33 Female   Adults 
5 80 Male Senior Citizen 
6 34 Male   Adults 
7 15 Female   Minors 
8 27 Female   Adults 
9 23 Male   Adults 
10 64 Female Senior Citizen 
11 38 Female   Adults 
12 12 Male   Minors 
13 32 Female   Adults 
14 21 Male   Adults 
15 66 Male Senior Citizen 
16 73 Female Senior Citizen 
17 22 Female   Adults 
+0

Vielen Dank für die hilfreiche Erklärung. Das ist toll! – pyuser181