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

回答編集履歴

8

2020/09/30 16:50

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -204,7 +204,7 @@
204
204
  これがPhase2-1終了後の`bottom_path_df`の中身です。
205
205
 
206
206
  ※このPhase2-1と2−2がこのプログラムの一番の鍵です。
207
- ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
207
+ ここでやってるのは、「列方向にTrueが連続しているセルをFalseにする」という処理です。
208
208
  画像処理でいうところの「エッジ検出処理」に近いです。
209
209
 
210
210
  # [Phase2-2]

7

2020/09/30 16:50

投稿

sfdust
sfdust

スコア1137

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]`は常に「2」という数になっています。
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

修正

2020/09/30 16:48

投稿

sfdust
sfdust

スコア1137

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

2020/09/30 16:45

投稿

sfdust
sfdust

スコア1137

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

2020/09/30 16:19

投稿

sfdust
sfdust

スコア1137

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

2020/09/30 15:46

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -143,7 +143,7 @@
143
143
  ```-例
144
144
  df.diff(2):
145
145
  a b c
146
- 0 NaN NaN NaN #行目、行目は、-1行目、0行目との差を計算することになるため、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 - True = False(0)`
158
+ `True(1) - True(1) = False(0)`
159
159
 
160
- `True - False = True(1)`
160
+ `True(1) - False(0) = True(1)`
161
161
 
162
- `False - True = True(-1)`
162
+ `False(0) - True(1) = True(-1)`
163
163
 
164
- `False - Fase = False(0)`
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
- `path_df.isnull().diff(-1, axis=1)`を適用すると、
182
+ `.diff(-1, axis=1)`を適用すると、
183
183
 
184
+ 0列目=0列目-1列目、 
184
- 0列目=0列目-1列目1列目1列目-2列目... と演算されるため、
185
+ 1列目1列目2列目...  と演算されるため、
185
186
 
186
187
  ```
187
188
  path_df.isnull().diff(-1, axis=1):

2

2020/09/30 15:42

投稿

sfdust
sfdust

スコア1137

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
- print("[Phase2-2]")
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
- print("[Phase2-3]")
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

参考を追加

2020/09/30 15:35

投稿

sfdust
sfdust

スコア1137

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]`という長ったらしく見える部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
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
- に対して、True/Falseで構成されたbottom_path_dfをインデックスとして適用することで、
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