前提
python pandas にて時系列の処理を行うにあたり、ある期間の欠損のあるデータを一日毎のデータとしたい、また、あるカラムのデータの順に並ぶようにしたいです。
実現したいこと
以下のように、現在のDataframeから欲しいDataframeのようにある決めた期間(今回ですと2000/1/1-2000/1/10)の1日ごとのデータにし、現在のDataFrameのs_1の順に並ぶようにしたいです。また、s_2,s_3はs_1の値であらかじめ決まっているものとして、欲しいDataframeへは欠損値とせず値を引き継ぎたいと考えています。
現在のDataframe date,s_1,s_2,s_3,v_1,v_2 2000-01-03,A,3,8,0.6,1.1 2000-01-05,A,3,8,5.0,1.5 2000-01-06,A,3,8,3.1,1.7 2000-01-07,A,3,8,6.5,1.5 2000-01-01,B,5,2,5.9,1.3 2000-01-02,B,5,2,5.4,1.4 2000-01-04,B,5,2,5.6,1.3 2000-01-09,B,5,2,5.4,1.2 欲しいDataframe date,s_1,s_2,s_3,v_1,v_2 2000-01-01,A,3,8,NA,NA 2000-01-02,A,3,8,NA,NA 2000-01-03,A,3,8,0.6,1.1 2000-01-04,A,3,8,NA,NA 2000-01-05,A,3,8,5.0,1.5 2000-01-06,A,3,8,3.1,1.7 2000-01-07,A,3,8,6.5,1.5 2000-01-08,A,3,8,NA,NA 2000-01-09,A,3,8,NA,NA 2000-01-10,A,3,8,NA,NA 2000-01-01,B,5,2,5.9,1.3 2000-01-02,B,5,2,5.4,1.4 2000-01-03,B,5,2,NA,NA 2000-01-04,B,5,2,5.6,1.3 2000-01-05,B,5,2,NA,NA 2000-01-06,B,5,2,NA,NA 2000-01-07,B,5,2,NA,NA 2000-01-08,B,5,2,NA,nA 2000-01-09,B,5,2,5.4,1.2 2000-01-10,B,5,2,NA,NA
試したこと
以下が参考になるかと思いましたが、データの期間が元のデータの範囲に拠ってしまう点、また、引き継ぐ内容も"source"の一列だけで、今回のように複数(s_1,s_2,s_3)引き継ぐにはどのようにすべきかまで至りませんでした。
import io from textwrap import dedent import pandas as pd csv_data = dedent( """ date,source,value 2000-01-01,A,0.66691 2000-02-01,A,5.04412 2000-03-01,A,3.15062 2000-05-01,A,6.57241 2000-01-01,B,95.9277 2000-03-01,B,85.4801 2000-04-01,B,85.6996 2000-05-01,B,55.4857 """ ) df = pd.read_csv(io.StringIO(csv_data), index_col="date", parse_dates=True) # あとで順番を戻せるよう元々の列名リストを記憶しておく orig_colnames = [str(c) for c in df.columns] # source ごとに欠損日時のデータを NaN で埋める dfs = [] sources = df["source"].unique() for source in sources: # その source の時系列データだけを取り出す tmp = df[df["source"] == source].drop(columns="source") # 欠損行を補完 tmp = tmp.resample("D").asfreq() # あとで結合するために結果を記録 tmp["source"] = source dfs.append(tmp) # source ごとに欠損行を補完したデータフレーム群を結合 df = pd.concat(dfs) # 列の順番を元に戻す df = df.reindex(columns=orig_colnames) print(df)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/25 14:48