web-dev-qa-db-ja.com

Pythonのplyrまたはdplyr

これはより概念的な質問で、特定の問題はありません。

私はデータ分析のためにpythonを学んでいますが、私はRに非常に精通しています-Rの素晴らしい点の1つはplyr(そしてもちろんggplot2)であり、さらに優れたdplyrです。 Pandasももちろん分割適用されていますが、Rでは次のようなことができます(dplyrではplyrとは少し異なり、dplyrがオブジェクトプログラミングの。表記をどのように模倣するかを確認できます)。

   data %.% group_by(c(.....)) %.% summarise(new1 = ...., new2 = ...., ..... newn=....)

複数の集計計算を同時に作成する

Pythonでそれを行う方法

df[...].groupby(.....).sum() only sums columns, 

rでは、1回の呼び出しで1つの平均、1つの合計、1つの特別な関数などを持つことができます

すべての操作を個別に実行してマージできることに気付きました。Pythonを使用している場合は問題ありませんが、ツールを選択することになると、入力してチェックして検証する必要のないコード行が追加されます。時間

さらに、dplyrではmutateステートメントを追加することもできるので、より強力だと思われます。pandasまたはpythonについて何が欠けているのでしょうか-

私の目標は学ぶことです。pythonを学ぶために多くの努力を費やしてきましたが、それは価値のある投資ですが、それでも問題は残っています

19
user1617979

Groupbyオブジェクトに適用される agg function を探していると思います。

ドキュメントから:

In [48]: grouped = df.groupby('A')

In [49]: grouped['C'].agg([np.sum, np.mean, np.std])
Out[49]: 
          sum      mean       std
A                                
bar  0.443469  0.147823  0.301765
foo  2.529056  0.505811  0.96
6
szxk

私はRのdplyrの大ファンでもあり、パンダの知識を向上させるために取り組んでいます。あなたは特定の問題を抱えていないので、私は以下の投稿をチェックして、入門用のDplyrビネット全体を分解し、Pandasでどのようにそれを実行できるかを示すことをお勧めします。

たとえば、作成者はRでパイプ演算子を使用したチェーンを示しています。

 flights %>%
   group_by(year, month, day) %>%
   select(arr_delay, dep_delay) %>%
   summarise(
      arr = mean(arr_delay, na.rm = TRUE),
      dep = mean(dep_delay, na.rm = TRUE)
       ) %>%
   filter(arr > 30 | dep > 30)

そして、ここにPandas実装があります:

flights.groupby(['year', 'month', 'day'])
   [['arr_delay', 'dep_delay']]
   .mean()
   .query('arr_delay > 30 | dep_delay > 30')

元の投稿でPandasを使用した操作のようなdplyrを実装する方法については、さらに多くの比較があります。 http://nbviewer.ipython.org/Gist/TomAugspurger/6e052140eaa5fdb6e8c

26
lgallen

Pythonのdplyrを使用するだけです。

Rpy2にはdplyrへのインターフェイスがあり(rpy2-2.7.0で導入)、次のようなものを記述できます。

dataf = (DataFrame(mtcars).
         filter('gear>3').
         mutate(powertoweight='hp*36/wt').
         group_by('gear').
         summarize(mean_ptw='mean(powertoweight)'))

ドキュメントの例 があります。ドキュメントのこの部分は(また)jupyterノートブックです。ページの上部にあるリンクを探します。

質問に対する別の答えは、Rのdplyrとpandas(@lgallenを参照)を比較することです。同じRの1ライナーチェーンのdplyrステートメントは、rpy2のdplyrのインターフェイスでも基本的に同じです。

R:

flights %>%
   group_by(year, month, day) %>%
   select(arr_delay, dep_delay) %>%
   summarise(
      arr = mean(arr_delay, na.rm = TRUE),
      dep = mean(dep_delay, na.rm = TRUE)
      ) %>%
   filter(arr > 30 | dep > 30)

Python + rpy2:

(DataFrame(flights).
 group_by('year', 'month', 'day').
 select('arr_delay', 'dep_delay').
 summarize(arr = 'mean(arr_delay, na.rm=TRUE)',
           dep = 'mean(dep_delay, na.rm=TRUE)').
 filter('arr > 30 | dep > 30'))
15
lgautier

Pythonでdplyrを使用する最も類似した方法は、dfplyパッケージを使用することです。ここに例があります。

R dplyr

library(nycflights13)
library(dplyr)

flights %>%
  filter(hour > 10) %>% # step 1
  mutate(speed = distance / (air_time * 60)) %>% # step 2
  group_by(Origin) %>% # step 3a
  summarize(mean_speed = sprintf("%0.6f",mean(speed, na.rm = T))) %>% # step 3b
  arrange(desc(mean_speed)) # step 4

# A tibble: 3 x 2
  Origin mean_speed
  <chr>  <chr>     
1 EWR    0.109777  
2 JFK    0.109427  
3 LGA    0.107362 

Python dfply

from dfply import *
import pandas as pd

flight_data = pd.read_csv('nycflights13.csv')

(flight_data >>
  mask(X.hour > 10) >> # step 1
  mutate(speed = X.distance / (X.air_time * 60)) >> # step 2
  group_by(X.Origin) >> # step 3a
  summarize(mean_speed = X.speed.mean()) >> # step 3b
  arrange(X.mean_speed, ascending=False) # step 4
)


Out[1]: 
  Origin  mean_speed
0    EWR    0.109777
1    JFK    0.109427
2    LGA    0.107362

Pythonパンダ

flight_data.loc[flight_data['hour'] > 10, 'speed'] = flight_data['distance'] / (flight_data['air_time'] * 60)
result = flight_data.groupby('Origin', as_index=False)['speed'].mean()
result.sort_values('speed', ascending=False)

Out[2]: 
  Origin     speed
0    EWR  0.109777
1    JFK  0.109427
2    LGA  0.107362

:詳細については、次の link を確認してください。

2
Rafael Díaz