2016-11-21 22 views
-2

私は以下のような入力データをデータフレームに持っています。月単位でデータフレーム列上に関数を適用し、月単位で列を表示する方法は?

id priority owner goal changed_time delta_time 
1 P1  bob 40 2016-11-02 20 
2 P2  bob 20 2016-11-02 10 
3 P3  bob 30 2016-11-02 50 
4 P1  alice 20 2016-10-02 70 
5 P1  bob 40 2016-10-02 05 
6 P1  bob 40 2016-10-02 24 
7 P3  alice 40 2016-09-02 34 
8 P1  bob 40 2016-09-02 20 
9 P2  ross 40 2016-09-02 10 
10 P1  bob 40 2016-11-02 20 
11 P2  sec 40 2016-09-02 34 
12 P3  bob 30 2016-11-02 90 

出力は次のようになります。私が行っている左側のグループ分けは、以下のように出力したいと思います。

    (Average of delta_time in monthly basis) 
owner priority goal 2016-11 2016-10 2016-09 

bob p1  40  
     p2  20 
     p3  30 
alice p1  20 
     p3  40 
ross p2  40 
sec p2  40 

のでDELTA_TIMEカラム上の平均関数を適用する方法changed_time列に応じて毎月の範囲にあることwhich'llとワイズ上記の表のような列に示されるべきです。私はすでに、私はこのような何か行っているでしょう

df[['owner','priority','Goal','Delta_time']].groupby([df.statusChangedtime.dt.month,'owner','priority']).mean() 

答えて

0

を使用してグループ化することによって、左側に取得しています:あなたの必要な形式を取得するには

df.groupby(['priority','owner',pd.PeriodIndex(data=df.changed_time, freq='M')]]).mean().unstack() 

One groupby


を、私はあなたを考えます2つの別々のグループを行う必要がありますconcat:

df1 = df.groupby(['priority','owner'])['goal'].mean() 
# You can also do: pd.DatetimeIndex(data=df.changed_time).month 
df2 = df.groupby(['priority','owner',pd.PeriodIndex(data=df.changed_time, freq='M')])['delta_time'].mean().unstack() 
pd.concat([df1, df2], axis=1) 

Two groupbys

+0

パーフェクト! ..たくさんありがとう@Julien – sabya

0

複数の言語タグがあるため、どの言語を使用するのかは疑問ではありません。一般的な質問では、焦点を合わせる必要があり、1つの言語でのみ対処する必要があります。これは、なぜ多くの人々が質問を落としたのだろうか。いずれにしても

、場合にあなたがここにRで答えを望んでいたが、いくつかの選択肢です:

1)は年/月カラム("time")を追加し、幅広いmeanを使用して長いから作り直すreshape2:

library(reshape2) 

df2 <- transform(df, time = substr(changed_time, 1, 7)) 
dcast(df2, owner + priority + goal ~ time, mean, value.var = "delta_time", fill = NA_real_) 

寄付:

owner priority goal 2016-09 2016-10 2016-11 
1 alice  P1 20  NA 70.0  NA 
2 alice  P3 40  34  NA  NA 
3 bob  P1 40  20 14.5  20 
4 bob  P2 20  NA  NA  10 
5 bob  P3 30  NA  NA  70 
6 ross  P2 40  10  NA  NA 
7 sec  P2 40  34  NA  NA 

2)dplyr/tidyr月/年"time"列を追加し、平均delta_timeをowner,priority,goalおよびtimeで計算します。最後に長いものから広いものに変換して並べ替えます。

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(time = substr(changed_time, 1, 7)) %>% 
    group_by(owner, priority, goal, time) %>% 
    summarize(delta_time = mean(delta_time)) %>% 
    ungroup() %>% 
    spread(time, delta_time) %>% 
    arrange(owner, priority) 

与えない:

# A tibble: 7 x 6 
    owner priority goal 2016-09 2016-10 2016-11 
    <fctr> <fctr> <int> <dbl> <dbl> <dbl> 
1 alice  P1 20  NA 70.0  NA 
2 alice  P3 40  34  NA  NA 
3 bob  P1 40  20 14.5  20 
4 bob  P2 20  NA  NA  10 
5 bob  P3 30  NA  NA  70 
6 ross  P2 40  10  NA  NA 
7 sec  P2 40  34  NA  NA 

3)何のパッケージを年/月カラム("time")を追加し、aggregateを使っ手段計算して、広いreshapeとソートを使用して長いから変換:

df2 <- transform(df, time = substr(changed_time, 1, 7)) 
ag <- aggregate(delta_time ~ owner + priority + goal + time, df2, mean) 
nms <- unique(as.character(sort(ag$time))) 
r <- reshape(ag, dir = "wide", idvar = c("owner", "priority", "goal"), varying = list(nms)) 
o <- order(r$owner, r$priority) 
r[o, ] 

与える:

owner priority goal 2016-09 2016-10 2016-11 
5 alice  P1 20  NA 70.0  NA 
4 alice  P3 40  34  NA  NA 
1 bob  P1 40  20 14.5  20 
7 bob  P2 20  NA  NA  10 
8 bob  P3 30  NA  NA  70 
2 ross  P2 40  10  NA  NA 
3 sec  P2 40  34  NA  NA 

注:入力データフレームdf再現可能な形では、次のとおり

Lines <- "id priority owner goal changed_time delta_time 
1 P1  bob 40 2016-11-02 20 
2 P2  bob 20 2016-11-02 10 
3 P3  bob 30 2016-11-02 50 
4 P1  alice 20 2016-10-02 70 
5 P1  bob 40 2016-10-02 05 
6 P1  bob 40 2016-10-02 24 
7 P3  alice 40 2016-09-02 34 
8 P1  bob 40 2016-09-02 20 
9 P2  ross 40 2016-09-02 10 
10 P1  bob 40 2016-11-02 20 
11 P2  sec 40 2016-09-02 34 
12 P3  bob 30 2016-11-02 90" 
df <- read.table(text = Lines, header = TRUE) 
+0

yeaa !!私はPythonとRの両方で答えが欲しかった。それで、私は質問のRにタグを付けました... Rの回答のために@Grothendieckに感謝します! – sabya

関連する問題