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

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

ただいまの
回答率

90.42%

  • Python

    9750questions

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

  • CSV

    739questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • pandas

    718questions

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

Pandasのデータフレームにカラム数の異なるcsvを取り込みたい

解決済

回答 1

投稿 編集

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

enoki

score 1

Pandasのデータフレームにカラム数の異なるcsvを取り込みたいと考えております。

具体的にはオシロスコープで取り込んだデータをpandasに取り込みpyplotでグラフを表示したいのですが、オシロスコープの仕様上以下のようなcsvが保存されます。

ModelName,DS-****
Acquisition Time,2019/01/** **:**:**
Time/div(second),0.2
Delay(second),-0.8
Delta(second),0.00002
Acquisition Mode,Normal
Trigger Address,10001
CH1 Volt/div,1
CH2 Volt/div,10
CH3 Volt/div,10
CH4 Volt/div,10
CH1 Offset,-1
CH2 Offset,-30
CH3 Offset,-5.0
CH4 Offset,0
Points,100002
Ch1 ,Ch2 ,Ch3 ,Ch4
1.0625,0.31250,,
1.125,0.31250,,
1.09375,0,,
1.0625,0.31250,,
1.09375,0.31250,,
1.09375,0.31250,,
1.0625,0.31250,,
1.09375,0,,
1.0625,0.31250,,
1.09375,0,,
1.09375,0.31250,,

この時、pandasのread_csvを実行すると、カラムが一致しませんといったエラーが出るため、正常に取り込むことができません。このため、以下のように型番や時間の後にカンマを付けてカラム数がすべての列で一致するようにcsvに手で書き換えています。

ModelName,DS-****,,
Acquisition Time,2019/01/** **:**:**,,
...
Ch1 ,Ch2 ,Ch3 ,Ch4
1.0625,0.31250,,
1.125,0.31250,,


しかし、これでは大量にオシロスコープから保存されるデータを効率よく解析することができません。

そのため、自動でカラム数を一致させる、もしくはcsvファイルを列で分割するようなプログラムがあれば良いと考えておりますが、解決策が出てきません。

現在のコードは以下の通りです。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

params = {"model_name": "ModelName", "measured_time": "Acquisition Time", "tdelta": "Delta(second)",
          "data_points": "Points"}  # ほしいパラメータとグラフ上のパラメータを対応
enable_channel = [3]
data_start_columns = 17  #

file_name = 'file.csv'

df = pd.read_csv(file_name, header=None, nrows=data_start_columns)

for items in params:  # 各種パラメータ表示
    # print(items)
    print(df[df[0] == params[items]].iat[0, 0] + ' : ' + df[df[0] == params[items]].iat[0, 1])

# 時間単位はms
data_points = float(df[df[0] == params['data_points']].iat[0, 1])
time_delta = float(df[df[0] == params['tdelta']].iat[0, 1]) * 1000
time_start = 0
time_end = data_points * time_delta

data_start_columns -= 1  # インデックスは0から
enable_channel = list(map(lambda x: x-1, enable_channel))


# データ本体の処理
df = pd.read_csv(file_name, skiprows=data_start_columns)
# df = df.reset_index()

df['time'] = pd.DataFrame(np.arange(time_start, time_end, time_delta), columns=['time'])  # 時間軸

for channel in enable_channel:
    df.plot(x='time', y=df.columns.values[channel])
plt.xlabel('time[ms]')
plt.ylabel('Volt[v]')
plt.show()
plt.savefig('hoge.png')

また、pyplotではplotを複数回行うと重ね書きができるようですが、pandasのplotを利用しているからか重ね書きができず、複数チャンネルを同時に一枚のグラフに書き出すことができず、困っております。

どなたかご教授のほどよろしくおねがいします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

測定データとその上は分けて読み込みましょうか。上の部分は固定長と仮定していますが、可変長ならもう少し何らかの工夫がいります。

import pandas as pd

# data.csvで保存したとする
data = pd.read_csv("data.csv", skiprows=16)
info = pd.read_csv("data.csv", skipfooter=len(data)+1, header=None, engine="python")
print(data)
print(info)
""" =>
       Ch1     Ch2   Ch3   Ch4
0   1.06250  0.3125   NaN  NaN
1   1.12500  0.3125   NaN  NaN
2   1.09375  0.0000   NaN  NaN
3   1.06250  0.3125   NaN  NaN
4   1.09375  0.3125   NaN  NaN
5   1.09375  0.3125   NaN  NaN
6   1.06250  0.3125   NaN  NaN
7   1.09375  0.0000   NaN  NaN
8   1.06250  0.3125   NaN  NaN
9   1.09375  0.0000   NaN  NaN
10  1.09375  0.3125   NaN  NaN
                   0                    1
0          ModelName              DS-****
1   Acquisition Time  2019/01/** **:**:**
2   Time/div(second)                  0.2
3      Delay(second)                 -0.8
4      Delta(second)              0.00002
5   Acquisition Mode               Normal
6    Trigger Address                10001
7       CH1 Volt/div                    1
8       CH2 Volt/div                   10
9       CH3 Volt/div                   10
10      CH4 Volt/div                   10
11        CH1 Offset                   -1
12        CH2 Offset                  -30
13        CH3 Offset                 -5.0
14        CH4 Offset                    0
15            Points               100002
"""

また、pyplotではplotを複数回行うと重ね書きができるようですが、pandasのplotを利用しているからか重ね書きができず、複数チャンネルを同時に一枚のグラフに書き出すことができず、困っております。

DataFrame.plotはax引数を取るので、df.plot()したときの返り値を保管しておいてaxに渡してあげてください。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/11 21:01

    迅速な回答ありがとうございました。
    上の部分についてはオシロスコープの機種により固定のため、問題ありません。

    キャンセル

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

  • Python

    9750questions

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

  • CSV

    739questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • pandas

    718questions

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