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

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

ただいまの
回答率

90.50%

  • Python

    7994questions

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

  • pandas

    584questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,222

pinocookie

score 11

前提・実現したいこと

現在オープンソースの人工衛星の観測データをダウンロードして、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)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

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

mergedの中にあるvy2mgd_2017.txt

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

import pandas as pd

URL="ftp://spdf.gsfc.nasa.gov/pub/data/voyager/voyager2/merged/vy2_2017.asc"

df = pd.read_csv(URL, delim_whitespace=True, header=None)
print(df)
#          0    1   2       3     4      5        6        7        8        9   \
# 0     2017    1   0  113.15 -31.6  218.0  999.999  999.999  999.999  999.999
# (略)
# [8760 rows x 37 columns]

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/20 10:00 編集

    回答ありがとうございます。
    教えていただいた方法をそのまま活用すると、コメントアウトしているようなデータフレームを得ることができました。

    このデータフレームの[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の書き方がおかしいのでしょうか
    よろしくお願いいたします。

    キャンセル

  • 2017/12/20 10:49

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

    キャンセル

  • 2017/12/20 13:05

    回答ありがとうございます。
    無事解決できました!

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

    キャンセル

0

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

import pandas as pd
from io import StringIO
s = """
2017,1,0,106.5
2017,1,1,106.5
2017,1,2,106.5
"""

ds_name = [ 'Year', 'DecimalDay', 'Hour', 'Distance']
df = pd.read_csv( StringIO(s), header=None, names=ds_name, index_col=None)
print(df)
print(df.info())

"""
   Year  DecimalDay  Hour  Distance
0  2017           1     0     106.5
1  2017           1     1     106.5
2  2017           1     2     106.5
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
Year          3 non-null int64
DecimalDay    3 non-null int64
Hour          3 non-null int64
Distance      3 non-null float64
dtypes: float64(1), int64(3)
memory usage: 176.0 bytes
None
"""

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/19 18: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)

    キャンセル

  • 2017/12/19 18:38 編集

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

    キャンセル

  • 2017/12/19 19:11

    対応ありがとうございます!
    勝手にタブ区切りと判断しておりました。

    現在接続が悪く私のPCからアクセスできないんですが、以下のURLから
    ftp://spdf.gsfc.nasa.gov/pub/data/voyager/voyager2/
    mergedの中にあるvy2mgd_2017.txt
    からデータをとってきました。

    キャンセル

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

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

関連した質問

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

  • Python

    7994questions

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

  • pandas

    584questions

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