回答編集履歴
8
f
answer
CHANGED
@@ -204,7 +204,7 @@
|
|
204
204
|
これがPhase2-1終了後の`bottom_path_df`の中身です。
|
205
205
|
|
206
206
|
※このPhase2-1と2−2がこのプログラムの一番の鍵です。
|
207
|
-
ここでやってるのは、「列方向に
|
207
|
+
ここでやってるのは、「列方向にTrueが連続しているセルをFalseにする」という処理です。
|
208
208
|
画像処理でいうところの「エッジ検出処理」に近いです。
|
209
209
|
|
210
210
|
# [Phase2-2]
|
7
f
answer
CHANGED
@@ -66,8 +66,12 @@
|
|
66
66
|
上記を実行し、出力結果をみながら、下記の説明を読んでみてください。
|
67
67
|
|
68
68
|
(読む前のポイントとして
|
69
|
-
`path_df.columns[-1]`は、`path_df`の一番最後の列のインデックスを示します。
|
69
|
+
`path_df.columns[-1]`は、`path_df`の一番最後(-1)の列(column)のインデックスを示します。
|
70
|
+
|
71
|
+
-1の意味は、リストでいう`a[-1]`と同じです。
|
72
|
+
|
70
|
-
この例では、`path_df.columns[-1]`は
|
73
|
+
この例では、path_dfは0、1、2の3列なので、`path_df.columns[-1]`は最後の列である「2」という数になります。
|
74
|
+
|
71
75
|
これ以降`path_df.columns[-1]`という長ったらしい部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
|
72
76
|
|
73
77
|
|
6
修正
answer
CHANGED
@@ -91,7 +91,6 @@
|
|
91
91
|
|
92
92
|
これ以降の 「Phase2(最深部だけ残す)」の最終目的は、
|
93
93
|
上記`path_df`のデータのうち**「各pathの末端(葉)だけを残し、それ以外は`NaN`に変換する」**ことです。
|
94
|
-
このために以降ガチャガチャやっているものと思われます。
|
95
94
|
この最終目的を頭の片隅に押さえておいてください。
|
96
95
|
|
97
96
|
続けましょう。
|
@@ -202,7 +201,7 @@
|
|
202
201
|
|
203
202
|
※このPhase2-1と2−2がこのプログラムの一番の鍵です。
|
204
203
|
ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
|
205
|
-
画像処理でいうところの「エッジ検出処理」に
|
204
|
+
画像処理でいうところの「エッジ検出処理」に近いです。
|
206
205
|
|
207
206
|
# [Phase2-2]
|
208
207
|
[Phase2-2]は、欠損値NaNとなってしまった最後列(例では2列目)を回復する処理です。
|
5
typo
answer
CHANGED
@@ -91,7 +91,7 @@
|
|
91
91
|
|
92
92
|
これ以降の 「Phase2(最深部だけ残す)」の最終目的は、
|
93
93
|
上記`path_df`のデータのうち**「各pathの末端(葉)だけを残し、それ以外は`NaN`に変換する」**ことです。
|
94
|
-
このために以降ガチャガチャや
|
94
|
+
このために以降ガチャガチャやっているものと思われます。
|
95
95
|
この最終目的を頭の片隅に押さえておいてください。
|
96
96
|
|
97
97
|
続けましょう。
|
4
key
answer
CHANGED
@@ -200,6 +200,9 @@
|
|
200
200
|
|
201
201
|
これがPhase2-1終了後の`bottom_path_df`の中身です。
|
202
202
|
|
203
|
+
※このPhase2-1と2−2がこのプログラムの一番の鍵です。
|
204
|
+
ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
|
205
|
+
画像処理でいうところの「エッジ検出処理」に該当します。
|
203
206
|
|
204
207
|
# [Phase2-2]
|
205
208
|
[Phase2-2]は、欠損値NaNとなってしまった最後列(例では2列目)を回復する処理です。
|
3
v
answer
CHANGED
@@ -143,7 +143,7 @@
|
|
143
143
|
```-例
|
144
144
|
df.diff(2):
|
145
145
|
a b c
|
146
|
-
0 NaN NaN NaN #
|
146
|
+
0 NaN NaN NaN #0行目、1行目は、存在しない-2行目、-1行目との差を計算することになるため、Nanになる。
|
147
147
|
1 NaN NaN NaN
|
148
148
|
2 2.0 8.0 26.0
|
149
149
|
3 2.0 12.0 56.0
|
@@ -151,17 +151,17 @@
|
|
151
151
|
```
|
152
152
|
|
153
153
|
そして`axis=1`とすると「行の比較」ではなく「列の比較」になります。
|
154
|
-
したがって`.diff(-1, axis=1)`とした場合「各データについて、1**列** 後ろのデータとの差」が抽出されます。(-1=負の数なので後ろのデータとの差分になります)
|
154
|
+
したがって`.diff(-1, axis=1)`とした場合「各データについて、1**列** **後ろ**のデータとの差」が抽出されます。(-1=負の数なので、前ではなく**後ろ**のデータとの差分になります)
|
155
155
|
|
156
156
|
ここで、pythonではFalseは0、Trueは1、0以外の数はTrueとして扱われるため
|
157
157
|
|
158
|
-
`True
|
158
|
+
`True(1) - True(1) = False(0)`
|
159
159
|
|
160
|
-
`True
|
160
|
+
`True(1) - False(0) = True(1)`
|
161
161
|
|
162
|
-
`False - True
|
162
|
+
`False(0) - True(1) = True(-1)`
|
163
163
|
|
164
|
-
`False -
|
164
|
+
`False(0) - False(0) = False(0)`
|
165
165
|
|
166
166
|
が成立します。
|
167
167
|
|
@@ -178,10 +178,11 @@
|
|
178
178
|
6 False False True
|
179
179
|
```
|
180
180
|
|
181
|
-
に対して、
|
181
|
+
これに対して、
|
182
|
-
`
|
182
|
+
`.diff(-1, axis=1)`を適用すると、
|
183
183
|
|
184
|
+
0列目=0列目-1列目、
|
184
|
-
|
185
|
+
1列目=1列目-2列目... と演算されるため、
|
185
186
|
|
186
187
|
```
|
187
188
|
path_df.isnull().diff(-1, axis=1):
|
2
f
answer
CHANGED
@@ -23,16 +23,18 @@
|
|
23
23
|
print(" path_df = pd.DataFrame(pathlist)")
|
24
24
|
print(" -> path_df:\n",path_df)
|
25
25
|
print()
|
26
|
+
|
26
27
|
# 重複削除
|
28
|
+
path_df = path_df.drop_duplicates()
|
27
29
|
print("[Phase1-2]重複削除")
|
28
|
-
path_df = path_df.drop_duplicates()
|
29
30
|
print(" path_df = path_df.drop_duplicates()")
|
30
31
|
print(" -> path_df:\n",path_df)
|
31
32
|
print()
|
33
|
+
|
32
34
|
# ソート
|
33
|
-
print("[Phase1-3]ソート")
|
34
35
|
path_df = path_df.sort_values(path_df.columns.tolist(),
|
35
36
|
na_position='first').reset_index(drop=True)
|
37
|
+
print("[Phase1-3](ソート)の完了後の")
|
36
38
|
print(" -> path_df:\n",path_df)
|
37
39
|
print()
|
38
40
|
print("path_df.columns[-1]= ",path_df.columns[-1])
|
@@ -47,18 +49,18 @@
|
|
47
49
|
print(" bottom_path_df = path_df.isnull().diff(-1, axis=1)")
|
48
50
|
print(" -> bottom_path_df:\n",bottom_path_df)
|
49
51
|
print()
|
50
|
-
|
52
|
+
|
51
53
|
bottom_path_df[path_df.columns[-1]] = ~path_df.isnull()[path_df.columns[-1]]
|
54
|
+
print("[Phase2-2] (完了後)")
|
52
55
|
print(" bottom_path_df[path_df.columns[-1]] = ~path_df.isnull()[path_df.columns[-1]]")
|
53
56
|
print(" -> bottom_path_df:\n",bottom_path_df)
|
54
57
|
print()
|
55
|
-
|
58
|
+
|
56
59
|
bottom_path_df = path_df[bottom_path_df]
|
60
|
+
print("[Phase2-3] (完了後)")
|
57
61
|
print(" bottom_path_df = path_df[bottom_path_df]")
|
58
62
|
print(" -> bottom_path_df:\n",bottom_path_df)
|
59
63
|
print()
|
60
|
-
|
61
|
-
# print(bottom_path_df)
|
62
64
|
```
|
63
65
|
|
64
66
|
上記を実行し、出力結果をみながら、下記の説明を読んでみてください。
|
1
参考を追加
answer
CHANGED
@@ -66,7 +66,7 @@
|
|
66
66
|
(読む前のポイントとして
|
67
67
|
`path_df.columns[-1]`は、`path_df`の一番最後の列のインデックスを示します。
|
68
68
|
この例では、`path_df.columns[-1]`は常に「2」という数になっています。
|
69
|
-
これ以降`path_df.columns[-1]`という長ったらし
|
69
|
+
これ以降`path_df.columns[-1]`という長ったらしい部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
|
70
70
|
|
71
71
|
|
72
72
|
逸れました。本題を続けていきましょう。
|
@@ -153,13 +153,13 @@
|
|
153
153
|
|
154
154
|
ここで、pythonではFalseは0、Trueは1、0以外の数はTrueとして扱われるため
|
155
155
|
|
156
|
-
`True-True=False(0)`
|
156
|
+
`True - True = False(0)`
|
157
157
|
|
158
|
-
`True-False=True(1)`
|
158
|
+
`True - False = True(1)`
|
159
159
|
|
160
|
-
`False-True=True(-1)`
|
160
|
+
`False - True = True(-1)`
|
161
161
|
|
162
|
-
`False-Fase=False(0)`
|
162
|
+
`False - Fase = False(0)`
|
163
163
|
|
164
164
|
が成立します。
|
165
165
|
|
@@ -177,7 +177,7 @@
|
|
177
177
|
```
|
178
178
|
|
179
179
|
に対して、
|
180
|
-
path_df.isnull().diff(-1, axis=1)を適用すると、
|
180
|
+
`path_df.isnull().diff(-1, axis=1)`を適用すると、
|
181
181
|
|
182
182
|
0列目=0列目-1列目、1列目1列目-2列目... と演算されるため、
|
183
183
|
|
@@ -195,7 +195,7 @@
|
|
195
195
|
|
196
196
|
となります。(2列目は、存在しない3列目との引き算を行うことになるためNaNになっている)
|
197
197
|
|
198
|
-
これがPhase2-1終了後のbottom_path_dfの中身です。
|
198
|
+
これがPhase2-1終了後の`bottom_path_df`の中身です。
|
199
199
|
|
200
200
|
|
201
201
|
# [Phase2-2]
|
@@ -251,11 +251,12 @@
|
|
251
251
|
```
|
252
252
|
|
253
253
|
データのインデックスにFalseを指定するとそのデータはNaNになります。
|
254
|
+
`path_df`は 元コードの最初の方でwalk()関数で得たディレクトリ構造の各データを保持しています.
|
254
255
|
|
255
|
-
path_dfはもともとの、walk()関数で得たディレクトリ構造の各データです
|
256
|
-
こ
|
256
|
+
この`path_df`に対して、True/Falseで構成された`bottom_path_df`をインデックスとして適用することで、
|
257
|
-
bottom_path_dfがTrueとなっているデータは生き残り、FalseとなっているセルはNaNとなります。
|
258
257
|
|
258
|
+
`bottom_path_df`がTrueとなっているデータは生き残り、FalseとなっているセルはNaNとなります。
|
259
|
+
|
259
260
|
```
|
260
261
|
[Phase2-3](完了後)
|
261
262
|
bottom_path_df = path_df[bottom_path_df]
|
@@ -270,4 +271,8 @@
|
|
270
271
|
6 NaN test1.xls NaN
|
271
272
|
```
|
272
273
|
|
273
|
-
以上により、bottom_path_df には、末端(葉)のデータだけ存在するようになりました。
|
274
|
+
以上により、`bottom_path_df` には、末端(葉)のデータだけ存在するようになりました。
|
275
|
+
|
276
|
+
参考:
|
277
|
+
https://note.nkmk.me/python-pandas-diff-pct-change/
|
278
|
+
https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203
|