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

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

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

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

pandas

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

Q&A

解決済

2回答

5989閲覧

Pandasのread_csvで最初の列がインデックスとなってしまう。

pinocookie

総合スコア17

Python

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

pandas

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

0グッド

0クリップ

投稿2017/12/19 08:32

###前提・実現したいこと
現在オープンソースの人工衛星の観測データをダウンロードして、pandasで解析しようと考えています。
人工衛星のデータは数値データのみで、ヘッダーやインデックスなどはありません。

2017 1 0 106.5 ...
2017 1 1 106.5 ...
2017 1 2 106.5 ...
("Year" "DecimalDay" "Hour" "Distance" ...)

希望としては、最初の行に0から始まるインデックス、ヘッダーにnames=ds_nameとして、自分でヘッダーを与えることを考えています(()内はデータの意味になります)。

###発生している問題・エラーメッセージ
ヘッダーを、ds_name = ["Year", "DecimalDay", ...]のように与えて、ソースコードにあるようにread_csv関数を用いました。
その結果、
. "Year" "DecimalDay" "Hour"
2017 1 0 106.5 ...
のように、最初の"Year"で与えたかった行がインデックスとなってしまい、ヘッダーが全体として1つずれてしまいました。

最初の行に0~最後までインデックスの数値を代入すれば解決できると思いますが、関数の引数を利用してこの問題を解決することはできないでしょうか。

よろしくお願いします。

###該当のソースコード
pd.read_csv("v2_mrg_2017.csv", header=None, names=ds_name, index_col=None)

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

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

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

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

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

guest

回答2

0

ベストアンサー

セパレータがTABなのか何個かのスペースなのかよくわからない場合は
delim_whitespace=True
を引数に渡すとよいかと思います。

mergedの中にあるvy2mgd_2017.txt

を見つけることができなかったので、とりあえず voyager2/merged/vy2_2017.asc で試してみましたが問題なく読み込むことができているようです。

Python

1import pandas as pd 2 3URL="ftp://spdf.gsfc.nasa.gov/pub/data/voyager/voyager2/merged/vy2_2017.asc" 4 5df = pd.read_csv(URL, delim_whitespace=True, header=None) 6print(df) 7# 0 1 2 3 4 5 6 7 8 9 \ 8# 0 2017 1 0 113.15 -31.6 218.0 999.999 999.999 999.999 999.999 9# (略) 10# [8760 rows x 37 columns]

投稿2017/12/19 23:55

magichan

総合スコア15898

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

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

pinocookie

2017/12/20 01:08 編集

回答ありがとうございます。 教えていただいた方法をそのまま活用すると、コメントアウトしているようなデータフレームを得ることができました。 このデータフレームの[header]に名前を付けたいと考えています。 例:得たいもの # "Year" "Day" "Hour" "Distance" "Latitude" .... #0 2017 .1 0 113.15 -31,6 .... #(略) このために、pd.read_csvの引数に、ヘッダーの名前をリストにしてあるds_nameを、names=ds_nameとして与えました。その結果以下のように一つ列がずれてヘッダーが配置されてしまいました。("Year"のヘッダーが本来"Day"のデータがある列に配置されてしまい、"Year"データの2017がインデックスになってしまいます) 例:ds_name ds_name = [ "Year", "Day", "Hour", "Distance", ... ] df = pd.read_csv(URL, delim_whitespace=True, header=None, names=ds_name) # "Year" "Day" "Hour" "Distance" .... #2017 1 0 113.15 -31.6 .... 引数の与え方や、names引数に与えているリストds_nameの書き方がおかしいのでしょうか よろしくお願いいたします。
magichan

2017/12/20 01:49

方法としては、全く問題ないかとおもいます。 確認していただきたいのは2点ほど (1) ds_name のサイズは Column数(37)と同数ですか (2) 表示がずれているだけということはありませんか print(df['Year']) としても、やはり間違った列の値が表示されますか
pinocookie

2017/12/20 04:05

回答ありがとうございます。 無事解決できました! 間違っていたところは(1)の点で、ds_name(36)と要素が1つ足りていませんでした。 ありがとうございます!
guest

0

提示コードにて特に問題なく読み込めます。
CSVのフォーマット詳細が不明ですがカンマ区切りではない可能性はないでしょうか?

Python

1import pandas as pd 2from io import StringIO 3s = """ 42017,1,0,106.5 52017,1,1,106.5 62017,1,2,106.5 7""" 8 9ds_name = [ 'Year', 'DecimalDay', 'Hour', 'Distance'] 10df = pd.read_csv( StringIO(s), header=None, names=ds_name, index_col=None) 11print(df) 12print(df.info()) 13 14""" 15 Year DecimalDay Hour Distance 160 2017 1 0 106.5 171 2017 1 1 106.5 182 2017 1 2 106.5 19<class 'pandas.core.frame.DataFrame'> 20RangeIndex: 3 entries, 0 to 2 21Data columns (total 4 columns): 22Year 3 non-null int64 23DecimalDay 3 non-null int64 24Hour 3 non-null int64 25Distance 3 non-null float64 26dtypes: float64(1), int64(3) 27memory usage: 176.0 bytes 28None 29"""

投稿2017/12/19 08:57

can110

総合スコア38234

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

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

pinocookie

2017/12/19 09:30

回答ありがとうございます! もともとtxtファイルだったものをcsvファイルに変換したんですが、元のファイルを見てみるとタブ区切りになっていました。以下参照 2017 1 0 113.15 -31.6 2017 1 1 113.15 -31.6 そこで、以下のようにコードを書き直して実行したところ、同じような問題が発生してしまいました。 ds2017 = pd.read_csv("v2_mrg_2017.txt", sep='\t', header=None, names=ds_name, index_col=None)
can110

2017/12/19 09:39 編集

当方環境では元データをタブ区切りにし「~sep='\t'~」にコード修正することで正常に読み込めます。 元データ.txtがタブ区切りであることはどのような手段で確認されましたか? なお、オープンデータであればデータ提供元および取得方法を提示いただくと再現確認しやすいのですが。
pinocookie

2017/12/19 10:11

対応ありがとうございます! 勝手にタブ区切りと判断しておりました。 現在接続が悪く私のPCからアクセスできないんですが、以下のURLから ftp://spdf.gsfc.nasa.gov/pub/data/voyager/voyager2/ mergedの中にあるvy2mgd_2017.txt からデータをとってきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問