teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加質問の回答

2019/11/01 10:39

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -2,4 +2,23 @@
2
2
 
3
3
  ```Python
4
4
  df['z'] = df.groupby(df.index//3)['y'].transform('mean')
5
+ ```
6
+
7
+ ---
8
+ **追記**
9
+
10
+ > 20個あるデータに対して前半10個と後半10個に分け、
11
+
12
+ 普通にやるとしたら、データの前半と後半を2回に分けて(ループで)上記の処理を行い、その結果を結合して 'z'列を追加するのでしょうかね
13
+ ただ、そのまま ``index//3``の値でグループ化をしてしまうと、後半部のグループの区切りがおかしくなるので単純に 0から9 までの値を3で割った値(整数部のみ)でグループ化しております。
14
+ ```
15
+ d = []
16
+ for i in [0,10]:
17
+ d.append(df[i:i+10].groupby(np.arange(10)//3)['y'].transform('mean'))
18
+ df['z'] = pd.concat(d)
19
+ ```
20
+ groupbyを二重にするとワンライナーで書くこともできますが可読性はわるそうです
21
+
22
+ ```Python
23
+ df['z'] = df.groupby(df.index//10, group_keys=False).apply(lambda d: d.groupby(np.arange(10)//3)['y'].transform('mean'))
5
24
  ```