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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

pandas

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

Q&A

解決済

2回答

3873閲覧

Python pandas 行番号を基にしたデータ追加について

chiaki38

総合スコア11

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

pandas

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

0グッド

1クリップ

投稿2017/02/07 05:59

環境:Python 2.7.10, pandas:0.18.1

###前提・実現したいこと
次のcsvファイルの各行にタイムスタンプを振りたいと考えています.

1行目はデータ計測を開始した時点のタイムスタンプ,
2行目は取得周期,
3行目以降はセンサデータ値となっています.

data.csv

1483805506 64 0.01 -0.03 -0.05 -0.05 0.13 0.36 0.66 ・・・

こちらのデータから,
タイムスタンプが1列目,センサデータが2列目になるような形で出力結果を得たいと考えています.

###試したこと
これまではタイムスタンプを格納するSeriesを一度作成して読み込んだデータと結合していました.
しかし,データ量が多く処理時間が長過ぎるため,for文を使用しないような方法を取りたいと思っています.

例えば,他の回答者様が提示されている(https://teratail.com/questions/27787)ような方法で,
処理できれば時間短縮になるかと考えているのですが,
行ごとに値を更新するために,行番号を用いて値を計算するといったことは可能なのでしょうか?

ご教授のほどよろしくお願いします.

こちらはこれまで試したソースコードになります.

python

1inputdata = pd.read_csv( data.csv ) 2 3tmp_time = inputdata.ix[0, 0] 4delta_time = 1 / tmp_time.ix[1, 0] 5 6for num in xrange( inputdata.shape[0] ): 7 tmp_time = tmp_time + delta_time 8 9 sr1 = pd.Series( [tmp_time], name='time' ) 10 sr2 = pd.Series( inputdata.ix[num], index=['data'] ) 11 sr2 = sr2.append(sr1) 12 13 outputdata = outputdata.append( sr2, ignore_index=True )

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

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

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

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

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

guest

回答2

0

.append()の処理がボトルネックになっていると思われます。

お察しの通り、index(行番号)を元に計算することが可能です。
枠となるシリーズまたはデータフレームを先に作っておき、その中にデータを入れ込む方が一般的には処理が早いです。

元のデータがcsvではなかったため、変数に代入することで代用しました。適宜変更してください。

python

1import pandas as pd 2 3tmp_time = 1483805506 4delta_time = 64 5inputdata = pd.Series([0.01, -0.03, -0.05, -0.05, 0.13, 0.36, 0.66]) 6 7df = pd.DataFrame(inputdata, columns=['data']) 8df['time'] = df.index.map(lambda x: tmp_time + delta_time * x) 9df = df.reindex_axis(['time' ,'data'], axis=1)

投稿2017/02/07 15:14

driller

総合スコア720

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

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

chiaki38

2019/07/16 02:38

ご回答ありがとうございます!参考になりました!
guest

0

ベストアンサー

python

1import datetime as dt 2header = pd.read_csv('data.csv', header=None, nrows=2) 3inputdata = pd.read_csv( 'data.csv' ,header=None, skiprows=2) 4delta_time = 1 / header.ix[1, 0] * 1000 5 6timestamp = pd.DataFrame(pd.date_range(dt.datetime.fromtimestamp(header.ix[0,0]), 7 periods=len(inputdata.index),freq=str(delta_time) + 'ms')) 8 9pd.concat([timestamp, inputdata], axis=1)

pandas の date_range を使うと良いと思います。
たぶん、lambdaを使うより、もっと高速かと思われます。

■追記

試しに2万レコードのデータでテストしてみました。

** 1. for loopで append した場合**

bash

1 CPU times: user 22.4 s, sys: 267 ms, total: 22.7 s 2 Wall time: 22.9 s

** 2. lambda で実行した場合**

bash

1 CPU times: user 26.6 ms, sys: 16 ms, total: 42.6 ms 2 Wall time: 69.1 ms

** 3. date_range を使った場合**

bash

1 CPU times: user 18.1 ms, sys: 5.51 ms, total: 23.6 ms 2 Wall time: 26.7 ms

投稿2019/05/17 14:09

編集2019/05/17 14:18
waku_nagoya

総合スコア200

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

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

chiaki38

2019/07/16 02:37

参考になりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問