2017-10-19 2 views
0

Ich habe genügend SO Fragen über die Verwendung von Pandas df.apply() -Funktion, wenn die Funktion angewendet wird, ist super trivial (wie .UPER() oder einfach Multiplikation). Wenn ich jedoch versuche, meine benutzerdefinierte Funktion anzuwenden, erhalte ich alle möglichen Fehler. Ich weiß nicht, wo mit diesem Fehler zu starten:Wenden Sie eine Funktion mit Argumenten auf jede Zeile mit df.apply()

Hier ist mein vereinfachtes Beispiel:

Meine gefälschten Daten:

inp = [{'c1':10, 'c2':1}, {'c1':11,'c2':110}, {'c1':12,'c2':0}] 
df1 = pd.DataFrame(inp) 
print(df1) 

Meine gefälschte Funktion

def fake_funk(row, upper, lower): 
    if lower < row['c1'] < upper: 
     return(1) 
    elif row['c2'] > upper: 
     return(2) 
    else: 
     return(0) 

Prüfung, dass es funktioniert in der Tat:

for index, row in df1.iterrows(): 
    print(fake_funk(row,11,1)) 
1 
2 
0 

Jetzt bewerben mit()

df1.apply(lambda row,: fake_funk(row,11,1)) 

Der Fehler Ich erhalte ziemlich lang ist:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5126)() 

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item (pandas/_libs/hashtable.c:14010)() 

TypeError: an integer is required 

During handling of the above exception, another exception occurred: 

KeyError         Traceback (most recent call last) 
<ipython-input-116-a554e891e761> in <module>() 
----> 1 df1.apply(lambda row,: fake_funk(row,11,1)) 

/usr/local/anaconda3/lib/python3.5/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds) 
    4260       f, axis, 
    4261       reduce=reduce, 
-> 4262       ignore_failures=ignore_failures) 
    4263    else: 
    4264     return self._apply_broadcast(f, axis) 

/usr/local/anaconda3/lib/python3.5/site-packages/pandas/core/frame.py in _apply_standard(self, func, axis, ignore_failures, reduce) 
    4356    try: 
    4357     for i, v in enumerate(series_gen): 
-> 4358      results[i] = func(v) 
    4359      keys.append(v.name) 
    4360    except Exception as e: 

<ipython-input-116-a554e891e761> in <lambda>(row) 
----> 1 df1.apply(lambda row,: fake_funk(row,11,1)) 

<ipython-input-115-e95f3470fb25> in fake_funk(row, upper, lower) 
     1 def fake_funk(row, upper, lower): 
----> 2  if lower < row['c1'] < upper: 
     3   return(1) 
     4  elif row['c2'] > upper: 
     5   return(2) 

/usr/local/anaconda3/lib/python3.5/site-packages/pandas/core/series.py in __getitem__(self, key) 
    599   key = com._apply_if_callable(key, self) 
    600   try: 
--> 601    result = self.index.get_value(self, key) 
    602 
    603    if not is_scalar(result): 

/usr/local/anaconda3/lib/python3.5/site-packages/pandas/core/indexes/base.py in get_value(self, series, key) 
    2475   try: 
    2476    return self._engine.get_value(s, k, 
-> 2477           tz=getattr(series.dtype, 'tz', None)) 
    2478   except KeyError as e1: 
    2479    if len(self) > 0 and self.inferred_type in ['integer', 'boolean']: 

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value (pandas/_libs/index.c:4404)() 

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value (pandas/_libs/index.c:4087)() 

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5210)() 

KeyError: ('c1', 'occurred at index c1') 

Antwort

2

standardmäßig apply arbeitet entlang der 0-ten Achse. Es scheint, dass Sie eine Operation entlang der 1. Achse benötigen. Übrigens brauchen Sie auch keinen lambda. Übergeben Sie einfach einen args Parameter, der ausreichen sollte.

df1.apply(fake_funk, axis=1, args=(11, 1)) 

0 1 
1 2 
2 0 
dtype: int64 
+0

Wow. Ich wusste, dass es so einfach sein würde. Vielen Dank. – AustinM

Verwandte Themen