質問編集履歴

4

解決方法の追記

2021/06/16 14:30

投稿

memene
memene

スコア1

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,13 @@
70
70
 
71
71
 
72
72
 
73
-
73
+ ### 解決方法
74
+
75
+ ```
76
+
77
+ df.assign(C=-df.reset_index().groupby('index').apply(lambda sdf: sdf.sort_values('順位')['得点'].diff(-1).sort_index()).to_numpy())
78
+
79
+ ```
74
80
 
75
81
 
76
82
 

3

教えて頂いたコードの実行結果報告のため

2021/06/16 14:30

投稿

memene
memene

スコア1

test CHANGED
File without changes
test CHANGED
@@ -217,3 +217,75 @@
217
217
 
218
218
 
219
219
  ```
220
+
221
+
222
+
223
+ ### 現在の状況 2
224
+
225
+
226
+
227
+ C列の計算結果は正しい数値が取得できました。ありがとうございます
228
+
229
+ あとは、DataFrameの構造をもとに戻す方法と、やり方が見えてきたので崩さずに追加できないか模索してみます!
230
+
231
+
232
+
233
+ ```
234
+
235
+ df2 = df.reset_index()
236
+
237
+ df2 = df2.rename(columns={'index':'group'})
238
+
239
+ temp_df = df2.set_index(['group', '順位'])
240
+
241
+ new_df = temp_df.assign(C=(temp_df.rename(index=lambda s: s-1, level=1) - temp_df)).reset_index()
242
+
243
+ new_df.head(20)
244
+
245
+
246
+
247
+ group 順位 得点 C
248
+
249
+ 0 201901010101 1.0 1.4 2.1
250
+
251
+ 1 201901010101 2.0 3.5 6.2
252
+
253
+ 2 201901010101 6.0 46.6 10.2
254
+
255
+ 3 201901010101 7.0 56.8 57.9
256
+
257
+ 4 201901010101 9.0 140.3 NaN
258
+
259
+ 5 201901010101 3.0 9.7 6.7
260
+
261
+ 6 201901010101 8.0 114.7 25.6
262
+
263
+ 7 201901010101 5.0 26.1 20.5
264
+
265
+ 8 201901010101 4.0 16.4 9.7
266
+
267
+ 9 201901010102 4.0 4.3 9.6
268
+
269
+ 10 201901010102 6.0 19.8 7.2
270
+
271
+ 11 201901010102 5.0 13.9 5.9
272
+
273
+ 12 201901010102 8.0 27.2 NaN
274
+
275
+ 13 201901010102 2.0 4.1 0.1
276
+
277
+ 14 201901010102 7.0 27.0 0.2
278
+
279
+ 15 201901010102 1.0 2.9 1.2
280
+
281
+ 16 201901010102 3.0 4.2 0.1
282
+
283
+ 17 201901010103 3.0 4.5 NaN
284
+
285
+ 18 201901010103 1.0 3.6 NaN
286
+
287
+ 19 201901010103 7.0 14.0 NaN
288
+
289
+
290
+
291
+ ```

2

誤字

2021/06/16 13:48

投稿

memene
memene

スコア1

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  df.head(20)
102
102
 
103
-     順位 得点
103
+ 順位 得点
104
104
 
105
105
  201901010101 1.0 1.4
106
106
 
@@ -170,7 +170,7 @@
170
170
 
171
171
 
172
172
 
173
-     順位 得点 C
173
+ 順位 得点 C
174
174
 
175
175
  index
176
176
 

1

教えて頂いたコードの実行結果の追記

2021/06/16 13:28

投稿

memene
memene

スコア1

test CHANGED
File without changes
test CHANGED
@@ -67,3 +67,153 @@
67
67
 
68
68
 
69
69
  一気にできる方法などありましたら、ご教授いただけますでしょうか
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ ### 現在の状況 1
78
+
79
+
80
+
81
+ 昨日に頂いたコードを実行しました。
82
+
83
+ ありがとうございます。
84
+
85
+ 目標)
86
+
87
+ indexのグループ別に、次の順位の人との得点の差を求めたいです
88
+
89
+
90
+
91
+ 結果)
92
+
93
+ 順位の最大数がindex別に変わるためだと思いますが、数値がずれるようです
94
+
95
+
96
+
97
+
98
+
99
+ ```
100
+
101
+ df.head(20)
102
+
103
+     順位 得点
104
+
105
+ 201901010101 1.0 1.4
106
+
107
+ 201901010101 2.0 3.5
108
+
109
+ 201901010101 6.0 46.6
110
+
111
+ 201901010101 7.0 56.8
112
+
113
+ 201901010101 9.0 140.3
114
+
115
+ 201901010101 3.0 9.7
116
+
117
+ 201901010101 8.0 114.7
118
+
119
+ 201901010101 5.0 26.1
120
+
121
+ 201901010101 4.0 16.4
122
+
123
+ 201901010102 4.0 4.3
124
+
125
+ 201901010102 6.0 19.8
126
+
127
+ 201901010102 5.0 13.9
128
+
129
+ 201901010102 8.0 27.2
130
+
131
+ 201901010102 2.0 4.1
132
+
133
+ 201901010102 7.0 27.0
134
+
135
+ 201901010102 1.0 2.9
136
+
137
+ 201901010102 3.0 4.2
138
+
139
+ 201901010103 3.0 4.5
140
+
141
+ 201901010103 1.0 3.6
142
+
143
+ 201901010103 7.0 14.0
144
+
145
+ ```
146
+
147
+ 実行と結果になります。
148
+
149
+ ```
150
+
151
+ df2 = df.reset_index()
152
+
153
+ df2['C'] = 0
154
+
155
+
156
+
157
+ for i in range(max(df['順位'].astype(int))):
158
+
159
+ df2['shift_index'] = df2['index'].shift(-i-1)
160
+
161
+ df2['shift_B'] = df2['得点'].shift(-i-1)
162
+
163
+ df2['C'] = df2['C'].mask((df2['順位']==i+1) & (df2['index']==df2['shift_index']), df2['shift_B']-df2['得点'])
164
+
165
+
166
+
167
+ df3 = df2.drop(['shift_index', 'shift_B'], axis=1).set_index('index')
168
+
169
+ df3.head(20)
170
+
171
+
172
+
173
+     順位 得点 C
174
+
175
+ index
176
+
177
+ 201901010101 1.0 1.4 2.1
178
+
179
+ 201901010101 2.0 3.5 53.3
180
+
181
+ 201901010101 6.0 46.6 -30.2
182
+
183
+ 201901010101 7.0 56.8 0.0
184
+
185
+ 201901010101 9.0 140.3 0.0
186
+
187
+ 201901010101 3.0 9.7 6.7
188
+
189
+ 201901010101 8.0 114.7 0.0
190
+
191
+ 201901010101 5.0 26.1 0.0
192
+
193
+ 201901010101 4.0 16.4 0.0
194
+
195
+ 201901010102 4.0 4.3 -0.2
196
+
197
+ 201901010102 6.0 19.8 -15.6
198
+
199
+ 201901010102 5.0 13.9 -9.7
200
+
201
+ 201901010102 8.0 27.2 0.0
202
+
203
+ 201901010102 2.0 4.1 -1.2
204
+
205
+ 201901010102 7.0 27.0 0.0
206
+
207
+ 201901010102 1.0 2.9 1.3
208
+
209
+ 201901010102 3.0 4.2 0.0
210
+
211
+ 201901010103 3.0 4.5 54.6
212
+
213
+ 201901010103 1.0 3.6 10.4
214
+
215
+ 201901010103 7.0 14.0 39.3
216
+
217
+
218
+
219
+ ```