2017-07-09 11 views
1

"California Housing"データセットをソースURLから直接pandasデータフレームにロードしようとしています。 URLは、2つのファイルcal_housing.dataとcal_housing.domainを含むtgzファイルを指します。Python pandas read_csv - データフレームにtgz-zippedデータセットをロードする

pandas read_csvを使ってファイルを読み込んでいてもうまくいきますが、私が理解しておらず、取り除きたいエラーが1つあります。データフレームの最初の値(最初の行、最初の列)がファイル名に置き換えられます。

これはcal_housing.dataは、次のようになります。

0 -122.230000,37.880000,41.000000,880.000000,129.000000,322.000000,126.000000,8.325200,452600.000000 
1 -122.220000,37.860000,21.000000,7099.000000,1106.000000,2401.000000,1138.000000,8.301400,358500.000000 
2 -122.240000,37.850000,52.000000,1467.000000,190.000000,496.000000,177.000000,7.257400,352100.000000 
3 ... 

これはcal_housing.domainは、次のようになります。

0 longitude: continuous. 
1 latitude: continuous. 
2 housingMedianAge: continuous. 
3 totalRooms: continuous. 
4 totalBedrooms: continuous. 
5 population: continuous. 
6 households: continuous. 
7 medianIncome: continuous. 
8 medianHouseValue: continuous. 

これは私が何をすべきかです:

import pandas as pd 
source = 'http://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz' 
col_names = ['longitude', 'latitude', 'housingMedianAge', 'totalRooms', 'totalBedrooms', 'population', 'households', 'medianIncome', 'medianHouseValue'] 
data = pd.read_csv(source, compression='gzip', header=None, names=col_names).dropna() 
print(type(data)) 

この私が得るものです:

0  CaliforniaHousing/cal_housing.data  37.88    41.0 ... 
1        -122.220000  37.86    21.0 ... 
2        -122.240000  37.85    52.0 ... 
... 

そして最後に、これは私が取得したいものです。

0  -122.230000  37.88    41.0 ... 
1  -122.220000  37.86    21.0 ... 
2  -122.240000  37.85    52.0 ... 
... 

答えて

0

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.htmlから圧縮:{ '推論'、 'gzipの'、 'BZ2'、 '郵便番号'、 ' xz '、None}、default ' infer 'オンディスク・データのオンザフライ・デコンプレッション。 'infer'の場合、 filepath_or_bufferがそれぞれ '.gz'、 '.bz2'、 '.zip'、または 'xz'で終わる文字列の場合はgzip、bz2、zipまたはxzを使用し、そうでない場合は 。 'zip'を使用している場合、ZIPファイルには1つのデータファイル を読み込む必要があります。圧縮解除しない場合は、[なし]に設定します。バージョン の新機能0.18.1: 'zip'と 'xz'圧縮のサポート。

リストにはタールボールは表示されません。 gzipのtarballに 'gzip'を使用しようとしているようです。ファイルをローカルに抽出し、別々のcsvファイルからデータフレームを読み取ることをお勧めします。

+0

それは私が行うにはしたくない、まさにです。私は解決策を見つけた。下記参照。 – cowhi

+0

あなたはあなたが見ていたものを見ていた理由を理解できなかったと答えました。答えはtgzがサポートされていないということです。他にどのような制約があったのか、あるいはファイルをローカルに抽出したくない理由についての情報は提供していませんでした。 –

+0

お時間をいただきありがとうございます。私は "URLから直接"書きました。私にとって、それはまさにそれを意味します。あなたが正しいです、それはこのファイルタイプをサポートしていないようですが、私が結果を見ていたときとよく似ていて、単純なパラメータがそれを変更するかもしれないと思いました。私はそのパラメータを見つけていないので、もっと複雑なものを作ります。 – cowhi

0

まあ、周りを遊んだ後、私は解決策を見つけました。私が望んでいたよりもはるかに複雑なので、見つけたらもっと良い解決策を投稿してください。

import pandas as pd 
import io 
import tarfile 
import urllib.request 
source = 'http://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz' 
col_names = ['longitude', 'latitude', 'housingMedianAge', 'totalRooms', 'totalBedrooms', 'population', 'households', 'medianIncome', 'medianHouseValue'] 
tar = tarfile.open(fileobj=urllib.request.urlopen(source), mode="r|gz") 
for member in tar: 
    if 'data' in member.name: 
     content = tar.extractfile(member).read() 
     data = pd.read_csv(io.BytesIO(content), encoding='utf8', header=None, names=col_names) 
print(data) 

そして、これは私が得るものです:

0  -122.230000  37.88    41.0 ... 
1  -122.220000  37.86    21.0 ... 
2  -122.240000  37.85    52.0 ... 
... 
関連する問題