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

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

ただいまの
回答率

90.84%

  • HTML

    8072questions

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

  • Python

    6388questions

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

  • Python 3.x

    4872questions

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

  • pandas

    416questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 459

DaichiYasuda

score 85

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

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

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

追記

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

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

df.columns = [onem + '年', '合計', '基本情報', 'お店から', '写真', '地図・クーポン', 'メニュー', '料理人', '私のオススメ', '電話番号', 'オリジナル', '誰と行く', 'シェフのオススメ', 'レコメンド', '着信数', '呼損数']
2017年,合計,基本情報,お店から,写真,地図・クーポン,メニュー,料理人,私のオススメ,電話番号,オリジナル,誰と行く,シェフのオススメ,レコメンド,着信数,呼損数
2017年,合計,基本情報,お店から,写真,地図・クーポン,メニュー,料理人,私のオススメ,電話番号,オリジナル,誰と行く,シェフのオススメ,レコメンド,着信数,呼損数
121日,260,133,5,0,18,82,3,0,1,1,15,0,0,2,0
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

【追記】

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

import pandas as pd

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

df.columns = df.iloc[0]
df = df.reindex(df.index.drop(0))
print(df)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 19:57

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

    キャンセル

+1

こんにちは。

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

from bs4 import BeautifulSoup
import pandas as pd

html = """
<html>
  <body>
    <table>
      <tr><td>10</td><td>20</td><td>31</td></tr>
      <tr><td>11</td><td>21</td><td>32</td></tr>
      <tr><td>12</td><td>22</td><td>33</td></tr>
      <tr><td>12</td><td>23</td><td>34</td></tr>
    </table>
  </body>
</html>
"""

soup = BeautifulSoup(html, "lxml")

tables = soup.find('table')
t_str = str(tables)
dfs = pd.io.html.read_html(t_str)
df = dfs[0]
df.columns = ['COL-A', 'COL-B', 'COL-C']

df.to_csv('test.csv')

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

,COL-A,COL-B,COL-C
0,10,20,31
1,11,21,32
2,12,22,33
3,12,23,34

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 00:12

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

    キャンセル

  • 2018/01/09 00:25

    追記を読みました。
    そういうことですと、

    tables = soup.find('table')
    t_str = str(tables)

    で取ってきた、 t_str の中身が知りたいです。

    t_str = str(tables)
    の直後に
    print(t_str)
    として出力されたものをコピペするか、元の HTMLの中にある対象の <table> 〜 </table> を
    コピペするかして、table の HTML も質問の中に提示して頂ければ、対策が分かるかも
    しれません。

    キャンセル

  • 2018/01/09 19:58

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

    キャンセル

  • 2018/01/09 20:42

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Python,DataFrameでcsvにカラムを追加して上書き保存

    以下のようなcsvがあった時に、DataFrameとしてcsvを読み込み、 カラムを追加して上書き保存するコードを書きたいのですがどのように書けばスマートでしょうか? <a

  • 解決済

    txtファイルを分割したい

    前提・実現したいこと iris_data.txtの中身を前半4つと最後の1つのファイルに分割したい。 分割後はcsvファイルに出力したいです。 一応、自分で書けたのですが冗長

  • 受付中

    大量のCSVデータの処理方法

    100個ほどCSVファイルがあり、 それぞれのファイルで、30×30のセルに数値が入力されています。 この100個のCSVファイルに対して、同じセル座標について最大値最小値を計算し

  • 解決済

    pythonを用いて、クラスタリングを行おうとすると、valueerror length of va...

    pythonを用いて、クラスタリングを行おうとすると、valueerror length of values does not match length of  index となり

  • 解決済

    python dataframe 結合で全組み合わせ

    python のデータフレームの結合で、2つのデータフレームの全組み合わせを取得したく、以下のような処理で行ってみました。 一応目的の全組み合わせは取得できたのですが、ダミーの

  • 解決済

    csvファイルの読み取り

    前提・実現したいこと 初めましてプログラムをはじめて間もないのですが、 現在csvファイルからデータを読み込みグラフを表示するプログラムを作っています。 csvは以下ののようになっ

  • 解決済

    Pythonで粒子の解析

    Python初心者です。 100×100×500cmの箱があり、そこに以下のような座標を持つ10種類の粒子(ABCDE...)あったとします。 X     Y     Z

  • 解決済

    データフレームのインデックスをデータフレームの列データに変換したい

    pandasを勉強しています。  階層的になっているindexを列データとして取得したいのですが、可能でしょうか? ご存じの方、お知恵を拝借させてください。 【pivotデ

同じタグがついた質問を見る

  • HTML

    8072questions

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

  • Python

    6388questions

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

  • Python 3.x

    4872questions

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

  • pandas

    416questions

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