質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

1405閲覧

htmlデータをpythonでスクレイプ→データフレームで抽出し、数字を乗算しコピーして行を増やしたい

yayaya22

総合スコア51

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/10/17 09:56

編集2021/10/20 09:57

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#この後の処理が不明。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

新しいバージョンだとpandas.DataFrame.explodeでできます。

New in version 1.3.0: Multi-column explode

Python

1import pandas as pd 2 3df = pd.DataFrame({'type':['P001'], 'title':['Z001'], 'ship':[6], 'lot':[[568,555]], 'qty':[[5,1]]}) 4df = df.explode(['lot','qty']) 5print(df) 6# type title ship lot qty 7#0 P001 Z001 6 568 5 8#0 P001 Z001 6 555 1

投稿2021/10/19 10:46

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yayaya22

2021/10/20 08:19

教示ありがとうございました。 新しい、pandasにアップデートした後に、こちら試しましたが、機能がなされませんでした。 追記いたしましたので、見ていただくと幸いです。
can110

2021/10/20 09:06

まず回答コードはエラーなく動作するでしょうか? 動作する場合、私の回答のようにデータも含めたエラーが再現できるコードを提示すると 検証できるかもしれません。
yayaya22

2021/10/20 09:55

回答コードはエラーなく動作いたしました。 ありがとうございました。 私の方のHTMLから抽出したコードはうまくいきませんでした。 なぜか、qty2列のほうが、引っかかっているようです。
yayaya22

2021/10/21 09:16

できました。 df['qty2'] = df['qty2'].astype(str).str.replace("'", '') CSVで確認したらこの行で"5","1"となっていなかったため、explodeが効かなかったようです。
guest

0

こういう感じです。

python

1>>> print(df) 2 type title order ship qty lot qty.1 Adj Price 30 P001 Z01 2 0 2 3 2 5 5 41 P002 Z02 2 0 2 1 1 3 4 52 P003 Z03 2 0 2 2 1 6 2 6>>> df2 = pd.concat(sum([[row]*row['lot'] for i, row in df.iterrows()], []), axis=1).T.reset_index(drop=True) 7>>> df2['lot'] = 1 8>>> print(df2) 9 type title order ship qty lot qty.1 Adj Price 100 P001 Z01 2 0 2 1 2 5 5 111 P001 Z01 2 0 2 1 2 5 5 122 P001 Z01 2 0 2 1 2 5 5 133 P002 Z02 2 0 2 1 1 3 4 144 P003 Z03 2 0 2 1 1 6 2 155 P003 Z03 2 0 2 1 1 6 2

投稿2021/10/17 11:31

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yayaya22

2021/10/19 09:54 編集

素早いご回答に的確なご指示ありがとうございました。こちら大変参考になりました。 しかしパターン2の問題が登場し、、追記をいたしました。こちらも教示いただきますと幸いです。
yayaya22

2021/10/21 09:11

ありがとうございました。 無事にできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問