回答編集履歴

1

追加質問の回答

2019/11/01 10:39

投稿

magichan
magichan

スコア15898

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