データフレームの前の行との差分を元のデータフレームに追加したい
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 315
前提・実現したいこと
お世話になります。
データフレームの操作方法について皆様のお知恵を拝借いただけないでしょうか。
目標としては、データフレーム内対象の列においてn行目からn−1行目を引いた数値をdeff列として元のデータフレームに追加したいです。(一行目の算出は0としたいです)
下のようなデータフレームがあるとします。
x
-3954305.448
-3954305.448
-3954305.443
-3954305.444
-3954305.446
-3954305.445
-3954305.444
データ加工例。
x deff
-3954305.448 0
-3954305.448 0
-3954305.443 0.004999999888
-3954305.444 -0.001000000164
-3954305.446 -0.001999999862
-3954305.445 0.001000000164
-3954305.444 0.0009999996983
発生している問題・エラーメッセージ
下記エラーが表示されます。
エラーメッセージ
a[i]において下記エラーメッセージが発生します
a value is trying to be set on a copy of a slice from a dataframe
該当のソースコード
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import datetime
data = pd.read_table('filedata',names=['id','x'],header=0,dtype = 'object')
var_id = ['id']
var_val = ['x']
data[var_id] = data[var_id].astype(object)
data[var_val] = data[var_val].astype(float)
def get_data(a):
b = [x for x in a]
for i, x in enumerate(a):
if i == 0:
a[i] = i
elif i != 0:
a[i] = round((a[i] - b[i-1])*10**9, 2)
return a
data['deff'] = get_data(data['x'])
使用言語python3.5(anaconda)
実施した内容
get_dataの変数aについて.locを指定したのですが、同じエラーが帰ってきてしまいました。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
pandas.Series.shift()
をつかいましょう
import pandas as pd
df = pd.DataFrame({'x': [-3954305.448, -3954305.448, -3954305.443, -3954305.444, -3954305.446, -3954305.445, -3954305.444]})
df['diff'] = (df['x'] - df['x'].shift(1)).fillna(0)
print(df)
# x diff
# 0 -3954305.448 0.000
# 1 -3954305.448 0.000
# 2 -3954305.443 0.005
# 3 -3954305.444 -0.001
# 4 -3954305.446 -0.002
# 5 -3954305.445 0.001
# 6 -3954305.444 0.001
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.06%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/18 15:54
shiftでできました。大変勉強になりました!
2017/12/18 15:59
用途によっては、こちらの方がシンプルかもしれませんね
df['diff'] = df['x'].diff(1).fillna(0)
2017/12/18 16:13
勉強になります。