2016-11-13 52 views
1

我已經習慣了使用R.如果我有這樣的RI會做這樣的事情:轉變從r到Python - 在大熊貓dplyr樣操作

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

我知道那裏有進行轉讓,但我可以」弄清楚將這些操作鏈接在一起的語法,特別是使用IFELSE類的東西。

任何人都試圖爲我打破這個?即使你不知道R我認爲代碼是相當常識..

回答

1

不知道這是你在找什麼,但我會這樣做在熊貓。特別是,我認爲np.where()是直接模擬R的ifelse(儘管我不太瞭解R)。在熊貓可能有類似的方法,但我總是發現np.where()是最快和最普遍的方法。

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 

你可以做一些或全部的這是一個方法鏈,雖然我在這裏看不到特別的優勢超越使得代碼更緊湊,乾淨的(不,我敲的!)。但其中的大部分區別僅僅是三條線,而「三條線」分佈在三條線上......

我不知道,YMMV,但很多這個歸結爲具體的例子,在這種情況下,我只是做它在三條獨立的熊貓行中,而不是像如何使用assignpipe作爲方法鏈。

+0

對於這個特殊的例子,因爲其他部分是'df.week',您可以使用'系列。 '''''''''''''''''''''''列'上的'mask'或'Series.where',但是沒有相應的np.where。 – ayhan

+0

@ayhan,謝謝,這就是我的想法。我一般堅持np.where的原因正是因爲我不必擔心df.where是否會起作用。 – JohnE

+0

@JohnE明天我會看看這個。我只是拋出了一個隨意的例子,它使用R -dplyr語法非常簡單,可以跨數據和函數組執行各種功能。我試圖瞭解一般熊貓或Python中的內容 – runningbirds

2

你會需要兩個分配呼叫和語法不漂亮:

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