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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

7256閲覧

pandasでhtmlからテーブルを取得する際、columnsを指定

DaichiYasuda

総合スコア173

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/01/08 13:10

編集2018/01/08 15:11

あるサイトのhtmlをbeautifulsoupで解析し、tableタグを取得。
pandasでtableタグを読み込みcsvファイルに出力させたいが、その際0行目をcolumnsとして読み込むことができない。

python

1tables = soup.find('table') 2t_str = str(tables) 3dfs = pd.io.html.read_html(t_str) 4df = dfs[0] 5df.columns = (ここがわからない)

0行目をcloumnsをして指定するにはどうすればよろしいでしょうか?

追記

2017年,合計,基本情報,お店から,写真,地図・クーポン,メニュー,料理人,私のオススメ,電話番号,オリジナル,誰と行く,シェフのオススメ,レコメンド,着信数,呼損数 12月1日,260,133,5,0,18,82,3,0,1,1,15,0,0,2,0

上記のcsvファイルで1行目をdf.columnsで指定したいです。
下記で指定するとcolumnsが2行になってしまいます

python

1df.columns = [onem + '年', '合計', '基本情報', 'お店から', '写真', '地図・クーポン', 'メニュー', '料理人', '私のオススメ', '電話番号', 'オリジナル', '誰と行く', 'シェフのオススメ', 'レコメンド', '着信数', '呼損数']

csv

12017年,合計,基本情報,お店から,写真,地図・クーポン,メニュー,料理人,私のオススメ,電話番号,オリジナル,誰と行く,シェフのオススメ,レコメンド,着信数,呼損数 22017年,合計,基本情報,お店から,写真,地図・クーポン,メニュー,料理人,私のオススメ,電話番号,オリジナル,誰と行く,シェフのオススメ,レコメンド,着信数,呼損数 312月1日,260,133,5,0,18,82,3,0,1,1,15,0,0,2,0

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

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

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

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

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

guest

回答2

0

ベストアンサー

pd.io.html.read_html() の引数にて、0行目をheader行に指定することで上手くいきませんか?

Python

1dfs = pd.io.html.read_html(t_str, header=0)

【追記】

上記の方法ではなく、DataFrame化した後に、1行目のデータをColumn名として設定する方法も記述しておきます。
(設定した後に、1行目を削除してIndexを振りなおしております。)

Python

1import pandas as pd 2 3df = pd.DataFrame([['2017年','合計','基本情報','お店から','写真','地図・クーポン','メニュー','料理人','私のオススメ','電話番号','オリジナル','誰と行く','シェフのオススメ','レコメンド','着信数','呼損数'], 4['12月1日',260,133,5,0,18,82,3,0,1,1,15,0,0,2,0]]) 5 6df.columns = df.iloc[0] 7df = df.reindex(df.index.drop(0)) 8print(df)

投稿2018/01/08 23:31

編集2018/01/08 23:46
magichan

総合スコア15898

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

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

DaichiYasuda

2018/01/09 10:57

dfs = pd.io.html.read_html(t_str, header=0) こういうやり方があるんですね。 ありがとうございました!
guest

0

こんにちは。

以下が望まれている回答になっているかやや心もとないのですが、
df.columns に配列を代入するのはいかがでしょう?

python

1from bs4 import BeautifulSoup 2import pandas as pd 3 4html = """ 5<html> 6 <body> 7 <table> 8 <tr><td>10</td><td>20</td><td>31</td></tr> 9 <tr><td>11</td><td>21</td><td>32</td></tr> 10 <tr><td>12</td><td>22</td><td>33</td></tr> 11 <tr><td>12</td><td>23</td><td>34</td></tr> 12 </table> 13 </body> 14</html> 15""" 16 17soup = BeautifulSoup(html, "lxml") 18 19tables = soup.find('table') 20t_str = str(tables) 21dfs = pd.io.html.read_html(t_str) 22df = dfs[0] 23df.columns = ['COL-A', 'COL-B', 'COL-C'] 24 25df.to_csv('test.csv')

上記を実行すると、以下のような CSV が生成され、df.columns
代入した文字列のリストが表のヘッダ行になります。

CSV

1,COL-A,COL-B,COL-C 20,10,20,31 31,11,21,32 42,12,22,33 53,12,23,34

※もし、入力に対する望ましい出力が上記と異なるのであれば、ご質問に追記して頂けると助かります。

以上、参考になりましたら幸いです。

投稿2018/01/08 14:48

jun68ykt

総合スコア9058

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

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

DaichiYasuda

2018/01/08 15:12

回答ありがとうございます。 追記させていただきました!
jun68ykt

2018/01/08 15:25

追記を読みました。 そういうことですと、 tables = soup.find('table') t_str = str(tables) で取ってきた、 t_str の中身が知りたいです。 t_str = str(tables) の直後に print(t_str) として出力されたものをコピペするか、元の HTMLの中にある対象の <table> 〜 </table> を コピペするかして、table の HTML も質問の中に提示して頂ければ、対策が分かるかも しれません。
DaichiYasuda

2018/01/09 10:58

回答ありがとうございました! dfs = pd.io.html.read_html(t_str, header=0)で1行目をheaderとして読み込むことができるらしく、そちらを参考にさせていただきました
jun68ykt

2018/01/09 11:42

解決されたようですね、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問