2016-04-14 6 views
-1

Ich habe ein Dataframe df, das tausende Zeilen hat.df.iloc [0: 1,:]. Apply (func, axis = 1, x, y, z) führt func() aus 2 mal

Für jede Zeile möchte ich Funktion func anwenden.

Als Test wollte ich func nur für die erste Zeile von df ausführen. In func() legte ich eine Druckanweisung. Ich erkannte, dass die print-Anweisung zweimal ausgeführt wurde, obwohl ich df in eine Zeile zerschneide (es gibt eine zusätzliche Zeile für Spalten, aber das sind Spalten).

Wenn ich die folgende

df[0:1].apply(func, axis=1, x,y,z) 

oder

df.iloc[0:1,:].apply(func, axis=1, x,y,z) 

Die print-Anweisung Sie 2 mal ausgeführt wird, was bedeutet, func() zweimal ausgeführt wurde.

Eine Idee, warum das passiert?

+0

Mögliche Duplikat von [Warum Pandas gelten, berechnen Sie zweimal] (http://stackoverflow.com/questions/21635915/why-does-pandas-apply-calculate-twice) – root

Antwort

0

Die doc klar sagt:

In der aktuellen Implementierung gelten fordert die erste Spalte/Zeile zweimal Func, um zu entscheiden, ob sie einen schnellen oder langsamen Codepfad nehmen.

+0

Ah, okay, also Anrufe zu func 2 mal nur für die erste Spalte/Zeile (in meinem Fall Reihe). – codingknob

0

achten bei verschiedenen Slicing-Techniken:

In [134]: df 
Out[134]: 
    a b c 
0 9 5 4 
1 4 7 2 
2 1 3 7 
3 6 3 2 
4 4 5 2 

In [135]: df.iloc[0:1] 
Out[135]: 
    a b c 
0 9 5 4 

In [136]: df.loc[0:1] 
Out[136]: 
    a b c 
0 9 5 4 
1 4 7 2 

mit Druck:

Druck einer Zeile als Serie:

In [139]: df[0:1].apply(lambda r: print(r), axis=1) 
a 9 
b 5 
c 4 
Name: 0, dtype: int32 
Out[139]: 
0 None 
dtype: object 

oder iloc mit:

In [144]: df.iloc[0:1, :].apply(lambda r: print(r), axis=1) 
a 9 
b 5 
c 4 
Name: 0, dtype: int32 
Out[144]: 
0 None 
dtype: object 

Druck zwei Reihen/Serie:

In [140]: df.loc[0:1].apply(lambda r: print(r), axis=1) 
a 9 
b 5 
c 4 
Name: 0, dtype: int32 
a 4 
b 7 
c 2 
Name: 1, dtype: int32 
Out[140]: 
0 None 
1 None 
dtype: object 

OP:

"die Aussage Druck ausgeführt wurde 2-mal, obwohl ich df eine Zeile am Slicing"

tatsächlich , Sie waren schneiden es in zwei Zeilen

+0

Ich führe df.loc nicht [0: 1]. Ich führe df [0: 1] das ist = df.loc [0: 1 ,:] – codingknob

+0

@codingknob, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Hoppla. Ich habe einen Fehler in meinem OP gemacht. Sein df.iloc [0: 1 ,:] nicht df.loc [0: 1 ,:] – codingknob

Verwandte Themen