pythonスクレイピングでテーブルデータを抽出しています。
「lot番号」が「5」の時に「同じ行を5回コピーして元あった行を消す」
ような処理をしたいと思います。
for文でいけそうなのですが、なかなか思いつかずの状態です。
よろしければ教示願います。
※10/19パターン2追記あり
パターン1(こちらは解決しました)
|P001|Z001|568|5
|:--|:--:|--:|
↓
|P001|Z001|568|1
|:--|:--:|--:|
|P001|Z001|568|1
|P001|Z001|568|1
|P001|Z001|568|1
|P001|Z001|568|1
パターン2
shipが総合数になっていて、lotとqtyがテーブル内で同じ枠(セル?)にある時、方法を考え
explodeメソッドでリストを展開させていたのですが、
Python
1#explodeメソッドでリストを展開させる 2df = df.explode('lot')
|type|title|ship|lot|qty
|:--|:--:|:--:|--:|
|P001|Z001|6|568,555|5,1
↓
|type|title|ship|lot|qty
|:--|:--:|:--:|--:|
|P001|Z001|6|568|5,1|:--|:--:|:--:|--:|
|P001|Z001|6|555|5,1
これだとlotは分かれますが、qtyが複製されどれを乗算指示すればいいのかが
分かりません。shipを元に判定してもいいですし、
568 を×5
555を×1にしたいです。
このとき、type title shipは複製されてかまいません。
【理想形です】
|type|title|ship|lot|qty
|:--|:--:|:--:|--:|
|P001|Z001|6|568|1|:--|:--:|:--:|--:|
|P001|Z001|6|568|1|:--|:--:|:--:|--:|
|P001|Z001|6|568|1|:--|:--:|:--:|--:|
|P001|Z001|6|568|1|:--|:--:|:--:|--:|
|P001|Z001|6|568|1|:--|:--:|:--:|--:|
|P001|Z001|6|555|1
教示お願い致します。
追記:10/20
パターン2で出力ができませんでした。
Python
1#半角をカンマにする 2df['lot'] = df['lot'].str.replace(' ', ',') 3 4#カンマをリストに変換 5df['lot'] = df['lot'].str.split(',') 6df['lot'] = df['lot'].str.split(',') 7 8df['qty2'] = df['qty2'].astype(str).str.replace(' ', ',') 9df['qty2'] = df['qty2'].str.split(',') 10df['qty2'] = df['qty2'].astype(str).str.replace("'", '') 11df = df.explode(['lot','qty2']) 12print(df) 13出力結果 14 15 type title order ship qty1 lot qty2 adj Price 160 P001 Z001 1 0 1 [811] [1] NaN 171 P002 Z002 1 0 1 [768] [1] NaN 182 P003 Z003 1 0 1 [063] [1] NaN 193 P004 Z004 6 0 6 [193] [6] NaN 204 P005 Z005 4 0 4 [210] [4] NaN 215 P006 Z006 2 0 2 [385] [2] NaN 226 P007 Z007 2 0 2 [277] [2] NaN 237 P008 Z008 2 0 2 [211] [2] NaN 248 P009 Z009 2 0 2 [295] [2] NaN 259 P010 Z010 2 0 2 [576] [2] NaN 2610 P011 Z011 2 0 2 [675] [2] NaN 2711 P012 Z012 6 0 6 [796, 310] [5,1] NaN 28 29 30 File "C:\Users****\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\frame.py", line 8254, in explode 31 raise ValueError("columns must have matching element counts") 32ValueError: columns must have matching element counts
エラーになります。
explodeのリストが効いていないようです。
最初に頂いたご回答を機能させるためにはどうすればよろしいでしょうか。
ちなみに
df.explode('lot')
は分かれてくれますが、
df.explode('qty2')
の場合、変化がありません。
HTML
1<table width="100%" class="list" id="ListTable"> 2 <tbody><tr><th>type</th><th>title</th><th>order</th><th>ship</th><th>qty</th><th>lot</th><th>qty</th><th>Adj Price</th></tr><tr><td><a target="_blank" href="******" tabindex="5"> 3 P001 4 </a></td><td>Z01</td><td class="rightJustify">2</td><td class="rightJustify">0</td><td class="rightJustify">2</td><td> 5 6 568<br> 7 8 9 573<br></td><td class="rightJustify"> 10 11 5<br> 12 13 5<br></td><td class="totalValues"></td></tr></tbody></table>
Python
1#テーブルを取得 2Table =driver.find_elements_by_id("ListTable")[0] 3str_html = Table.get_attribute("outerHTML") 4dfs = pd.read_html(str_html) 5print((dfs)[0]) 6 7#半角をカンマにする 8df['lot'] = df['lot'].str.replace(' ', ',') 9 10#カンマをリストに変換 11df['lot'] = df['lot'].str.split(',') 12 13#explodeメソッドでリストを展開させる 14df = df.explode('lot') 15 16#この後の処理が不明。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/20 08:19
2021/10/20 09:06
2021/10/20 09:55
2021/10/21 09:16