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

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

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

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

pandas

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

Q&A

解決済

1回答

4576閲覧

Pythonのpandasでのデータ取得時に、文字列が数値として読み込まれる動作について

pikesaku

総合スコア11

Python

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

pandas

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

0グッド

0クリップ

投稿2016/09/01 10:20

編集2016/09/01 10:24

###前提・実現したいこと

PythonのPandasでhtmlファイル内の表データを取得したいと考えています。

###発生している問題・エラーメッセージ

表内のデータである文字列001が数字の1としてデータフレームに格納されてしまいます。
文字列001としてデータフレームに格納する方法を教えて頂けますでしょうか?

事象再現方法

①以下の/tmp/a.htmlファイルを用意する

html

1<table> 2 <thead> 3 <tr> 4 <th>a</th> 5 <th>b</th> 6 <th>c</th> 7 </tr> 8 </thead> 9 <tbody> 10 <tr> 11 <td>test</th> 12 <td>100</td> 13 <td>001</td> 14 </tr> 15 </tbody> 16</table>

②Pythonの対話操作で以下を行う。

python

1>>> import pandas 2>>> df = pandas.io.html.read_html('/tmp/a.html') 3>>> df 4[ a b c 50 test 100 1]

001が1として、データフレームに格納されます。

###試したこと

該当カラムのdtypeを確認したところ、int64になってました。

python

1>>> df[0].dtypes 2a object 3b int64 4c int64 5dtype: object 6>>>

またhtmlからthead・tbodyタグを外したら、001が文字列として読み込まれました。

事象再現方法
①以下の/tmp/b.htmlファイルを用意する

html

1<table> 2 <tr> 3 <th>a</th> 4 <th>b</th> 5 <th>c</th> 6 </tr> 7 <tr> 8 <td>test</th> 9 <td>100</td> 10 <td>001</td> 11 </tr> 12</table>

②Pythonの対話操作で以下を行う。

python

1>>> import pandas 2>>> df = pandas.io.html.read_html('/tmp/b.html') 3>>> df 4[ 0 1 2 50 a b c 61 test 100 001] 7>>> df[0].dtypes 80 object 91 object 102 object 11dtype: object 12>>>

###補足情報(言語/FW/ツール等のバージョンなど)
OS: RHEL7
Python Ver: 2.7
pandas ver: 0.18.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

a.htmlをそのまま読み込むと、DataFrameではなくlistになってしまうんですね。

HTMLを加工してからpandasに渡す回避方法を考えてみました。
この方法がベストかは分かりませんが、pandas側で対応するのは難しそうなので...

要は

htmlからthead・tbodyタグを外したら、001が文字列として読み込まれました。

をプログラムで行うようにしただけです。

BeautifulSoupでtheadtbodyを取り除いた文字列にしてから、pandasに渡します。

lang

1import pandas 2from pandas.compat import StringIO 3from bs4 import BeautifulSoup 4 5with open('/tmp/a.html') as f: 6 orig_html = f.read() 7soup = BeautifulSoup(orig_html, 'lxml') 8[tag.replaceWithChildren() for tag in soup('thead') + soup('tbody')] 9html = unicode(soup) 10 11df = pandas.read_html(StringIO(html)) 12print df

投稿2016/09/01 18:18

argius

総合スコア9390

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

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

pikesaku

2016/09/02 02:23

ご回答ありがとうございました。 私はpython初心者でして、ご回答いただき大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問