2016-11-13 6 views
1

ich mit R. gewohnt bin Wenn ich dies in RI hatte so etwas tun würde:von r auf Python Übergang - dplyr-ähnliche Operationen in Pandas

 library(dplyr) 
df = df %>% 
mutate(
    XYZ = sum(x+y+z), 
    weekcheck = ifelse(week > 3 & X*2 > 4, 'yes',week), # multi-step if statement   
     XYZ_plus_3 = XYZ + 3 
     ) 

df = pd.DataFrame({ 
      'x': np.random.uniform(1., 168., 20), 
      'y': np.random.uniform(7., 334., 20), 
      'z': np.random.uniform(1.7, 20.7, 20), 
      'month': [5,6,7,8]*5, 
      'week': np.random.randint(1,4, 20) 
      }) 

Ich weiß, Theres zuweisen, aber ich kann‘ T Finde die Syntax für die Verkettung dieser Operationen zusammen, vor allem mit IFELSE Art der Sache.

Wer versucht, dies für mich zu brechen? Auch wenn Sie nicht wissen, R ich denke, der Code ist ziemlich common sense ..

Antwort

1

Nicht sicher, ob das, was Sie suchen, aber ich würde es so in Pandas tun. Insbesondere glaube ich, dass np.where() eine direkte Analogie zu R ifelse ist (ich kenne R nicht sehr gut). Es mag einen ähnlichen Weg geben, dies in Pandas zu tun, aber ich habe immer np.where() als den schnellsten und allgemeinsten Ansatz gefunden.

df['xyz'] = df.x + df.y + df.z 
df['wcheck'] = np.where((df.week>2) & (df.x*2>4), 'yes', df.week) 
df['xyz_p3'] = df.xyz + 3 

    week   x   y   z   xyz wcheck  xyz_p3 
0  2 1.968759 31.537797 18.984273 52.490830  2 55.490830 
1  1 108.809481 295.126414 14.250059 418.185954  1 421.185954 
2  3 124.094087 201.229196 15.346794 340.670077 yes 343.670077 
3  2 122.874717 110.675192 6.179610 239.729519  2 242.729519 
4  1 74.909326 12.484076 4.921888 92.315290  1 95.315290 

Sie könnten einige oder alle diese als eine Methode Kette tun, obwohl ich (dass ich das bin nicht klopfen!) Keinen besonderen Vorteil hier jenseits macht der Code ein wenig kompakter und sauber sehen. Aber viel von dem Unterschied ist nur drei Zeilen vs "eine Zeile", die über drei Zeilen verteilt ist ...

Ich weiß nicht, YMMV, aber eine Menge davon kommt auf bestimmte Beispiele und in diesem Fall würde ich nur tun es in drei separaten Linien von Pandas im Gegensatz zu herauszufinden, wie es als Methode Kette mit assign oder pipe zu tun.

+0

Für dieses spezielle Beispiel, da der sonst Teil 'df.week' ist, können Sie entweder' Serie. Maske 'oder' Series.where' on 'week' Spalte, aber es gibt keine Entsprechung von np.where. – ayhan

+0

@ayhan, danke, das habe ich mir gedacht. Ich bleibe in der Regel bei np.where aus genau diesem Grund, da ich mich nicht sorgen muss, wenn df.where funktioniert oder nicht. – JohnE

+0

@Johann Ich werde mir das morgen ansehen. Ich habe nur ein zufälliges Beispiel von meinem Kopf weggeworfen, wo es mit der R-dplyr-Syntax extrem einfach ist, eine Vielzahl von Funktionen über Gruppen von Daten und Funktionen hinweg auszuführen. Ich versuche herauszufinden, was das in Pandas oder Python im Allgemeinen bedeutet – runningbirds

2

Sie müssen zwei assign fordern, dass und die Syntax ist nicht so schön:

(df.assign(XYZ=df[['x', 'y', 'z']].sum(axis=1), 
      weekcheck=np.where((df['week']>3) & (df['x']*2>4), 'yes', df['week'])) 
    .assign(XYZ_plus_3=lambda d: d['XYZ']+3)) 
Verwandte Themen