これはより概念的な質問で、特定の問題はありません。
私はデータ分析のために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を学ぶために多くの努力を費やしてきましたが、それは価値のある投資ですが、それでも問題は残っています
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
私は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
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'))
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 を確認してください。