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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

4回答

793閲覧

pandasで1時間先のデータを新たなカラムに格納したい

ikegami_m

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2021/04/01 10:17

編集2021/04/01 10:19

pandasのカラムの中にdatetime型があるとして、1時間先のデータを新しいカラムとして格納したいです。
下記データフレームに「value_1h」というカラムを作成し、valueの1時間先に相当するデータを格納していきたいです。

python

1df1 = pd.DataFrame({ 2 '地名':['東京','東京','東京','東京','東京','大阪','大阪','大阪','大阪','大阪'], 3 '時刻':['2018-08-22 00:00:00', 4 '2018-08-22 01:00:00', 5 '2018-08-22 02:00:00', 6 '2018-08-22 03:00:00', 7 '2018-08-22 04:00:00', 8 '2018-08-22 00:00:00', 9 '2018-08-22 01:00:00', 10 '2018-08-22 02:00:00', 11 '2018-08-22 03:00:00', 12 '2018-08-22 04:00:00'], 13 'value':[10,6,4,10,8,3,7,5,6,4]}) 14df1['時刻'] = pd.to_datetime(df1['時刻']) 15df1 16 17-------------- 18 地名 時刻 value 190 東京 2018-08-22 00:00:00 10 201 東京 2018-08-22 01:00:00 6 212 東京 2018-08-22 02:00:00 4 223 東京 2018-08-22 03:00:00 10 234 東京 2018-08-22 04:00:00 8 245 大阪 2018-08-22 00:00:00 3 256 大阪 2018-08-22 01:00:00 7 267 大阪 2018-08-22 02:00:00 5 278 大阪 2018-08-22 03:00:00 6 289 大阪 2018-08-22 04:00:00 4 29-------------- 30

python

1for x,y in zip(df1['地名'],df1['時刻']): 2 if (y + datetime.timedelta(hours=1)) == datetime.datetime(2018, 8, 22, 5, 0): 3 continue 4 else: 5 df1['value_1h'][(df1['地名']== x)&(df1['時刻']== y)] = df1['value'][(df1['地名']== x)&(df1['時刻']==(y + datetime.timedelta(hours=1)))] 6 7df1 8 9期待していた内容: 10-------------- 11 地名 時刻 value value_1h 120 東京 2018-08-22 00:00:00 10 6 131 東京 2018-08-22 01:00:00 6 4 142 東京 2018-08-22 02:00:00 4 10 153 東京 2018-08-22 03:00:00 10 8 164 東京 2018-08-22 04:00:00 8 175 大阪 2018-08-22 00:00:00 3 7 186 大阪 2018-08-22 01:00:00 7 5 197 大阪 2018-08-22 02:00:00 5 6 208 大阪 2018-08-22 03:00:00 6 4 219 大阪 2018-08-22 04:00:00 4 22-------------- 23 24実際の結果: 25-------------- 26 地名 時刻 value value_1h 270 東京 2018-08-22 00:00:00 10 NaN 281 東京 2018-08-22 01:00:00 6 NaN 292 東京 2018-08-22 02:00:00 4 NaN 303 東京 2018-08-22 03:00:00 10 NaN 314 東京 2018-08-22 04:00:00 8 325 大阪 2018-08-22 00:00:00 3 NaN 336 大阪 2018-08-22 01:00:00 7 NaN 347 大阪 2018-08-22 02:00:00 5 NaN 358 大阪 2018-08-22 03:00:00 6 NaN 369 大阪 2018-08-22 04:00:00 4 37-------------- 38

なぜ、value_1hがNaNになるのかが分かりません。
期待する内容になるにはどのようにすればよろしいでしょうか。

##動作環境
Windows10 Anaconda Python3.6

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

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

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

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

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

guest

回答4

0

一応書いておきます。

python

1shift_df = df1.groupby('地名', as_index=False).apply(lambda df: df.set_index('時刻').shift(-1, 'h')) 2df1.merge(shift_df, on=['地名', '時刻'], how='left') 3# 地名 時刻 value_x value_y 4# 0 東京 2018-08-22 00:00:00 10 6.0 5# 1 東京 2018-08-22 01:00:00 6 4.0 6# 2 東京 2018-08-22 02:00:00 4 10.0 7# 3 東京 2018-08-22 03:00:00 10 8.0 8# 4 東京 2018-08-22 04:00:00 8 NaN 9# 5 大阪 2018-08-22 00:00:00 3 7.0 10# 6 大阪 2018-08-22 01:00:00 7 5.0 11# 7 大阪 2018-08-22 02:00:00 5 6.0 12# 8 大阪 2018-08-22 03:00:00 6 4.0 13# 9 大阪 2018-08-22 04:00:00 4 NaN

他の方の解答よりも高速かと思います。

投稿2021/04/02 01:00

kirara0048

総合スコア1399

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

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

ikegami_m

2021/04/02 02:05

ご丁寧にありがとうございます。
guest

0

以下の方法でできます。

python

1>>> def after_a_hour(row): 2... try: 3... return df1[(df1[['地名', '時刻']] == (row['地名'], row['時刻']+datetime.timedelta(hours=1))).apply(lambda x: x['地名'] and x['時刻'], axis=1)].iloc[0,2] 4... except: 5... return None 6... 7>>> df1['value_1h'] = df1.apply(after_a_hour, axis=1) 8>>> 9>>> df1 10 地名 時刻 value value_1h 110 東京 2018-08-22 00:00:00 10 6.0 121 東京 2018-08-22 01:00:00 6 4.0 132 東京 2018-08-22 02:00:00 4 10.0 143 東京 2018-08-22 03:00:00 10 8.0 154 東京 2018-08-22 04:00:00 8 NaN 165 大阪 2018-08-22 00:00:00 3 7.0 176 大阪 2018-08-22 01:00:00 7 5.0 187 大阪 2018-08-22 02:00:00 5 6.0 198 大阪 2018-08-22 03:00:00 6 4.0 209 大阪 2018-08-22 04:00:00 4 NaN

投稿2021/04/01 11:36

ppaul

総合スコア24670

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

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

ikegami_m

2021/04/01 22:09

その方法でも可能ですね。ありがとうございます!
guest

0

ベストアンサー

Python

1for i, d in df1.iterrows(): 2 if (len(df1[(df1['地名'] == d['地名']) & (df1['時刻'] == d['時刻'] + datetime.timedelta(hours=1))])) == 1: 3 df1.loc[i, 'value_1h'] = df1.loc[(df1['地名'] == d['地名']) & (df1['時刻'] == d['時刻'] + datetime.timedelta(hours=1)), 'value'].values[0] 4 5print(df1) 6# 地名 時刻 value value_1h 7#0 東京 2018-08-22 00:00:00 10 6.0 8#1 東京 2018-08-22 01:00:00 6 4.0 9#2 東京 2018-08-22 02:00:00 4 10.0 10#3 東京 2018-08-22 03:00:00 10 8.0 11#4 東京 2018-08-22 04:00:00 8 NaN 12#5 大阪 2018-08-22 00:00:00 3 7.0 13#6 大阪 2018-08-22 01:00:00 7 5.0 14#7 大阪 2018-08-22 02:00:00 5 6.0 15#8 大阪 2018-08-22 03:00:00 6 4.0 16#9 大阪 2018-08-22 04:00:00 4 NaN

投稿2021/04/01 11:14

meg_

総合スコア10749

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

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

ikegami_m

2021/04/01 11:20

解決しました!ありがとうございました。
guest

0

ふたを開けてみれば、単純なことに引っかかっていました。
最後に「.values[0]」を付けるだけで解決しました。

python

1for x,y in zip(df1['地名'],df1['時刻']): 2 if (y + datetime.timedelta(hours=1)) == datetime.datetime(2018, 8, 22, 5, 0): 3 continue 4 else: 5 df1['value_1h'][(df1['地名']== x)&(df1['時刻']== y)] = df1['value'][(df1['地名']== x)&(df1['時刻']==(y + datetime.timedelta(hours=1)))].values[0]

投稿2021/04/01 11:24

ikegami_m

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問