私はother_colsに他のすべての関係のない列をグループ化し、フォームのデータフレーム(9Kエントリを)持っている:マルチインデックスデータフレームの作成のスピードアップ
print(df_test[0:4])
index TF-Objektnummer Date other_cols
0 0 4259619 1970-01-01 13:45:41.000014557 xx
1 1 4186279 2014-10-20 06:42:23.000056098 yy
2 2 4185787 2014-10-16 06:18:56.000067086 zz
3 3 4259599 1970-01-01 13:03:59.000083584 kk
日付は(fillnaから)一日のランダムな時間を持つUNIXエポックのどちらかでありますまたはインストール日時。
レベルインデックスがTF-Objektnummerで、レベル1インデックスが次のように定義されたdatetime範囲であるマルチインデックスデータフレームです(inter:inter = df_test.loc [ind]) :各TF-Objektnummer用言い換えれば
minff=pd.to_datetime('2001-01-07 00:00:00')
maxMD=pd.to_datetime('2017-08-31 08:33:34.000057100')
if inter["Date"]< minff:
start=minff
else:
start=inter["Date"]
dt_index=pd.date_range(start=start,end=maxMD)
は、私はほかに、私はなどの列の年、日、シーズンを追加したい、maxMDの範囲の日付のすべての日付でレベル1にインデックスさ行を作成したいですlevel1のインデックスCOLSは関係のないother_colsのリストだけである(
index TF-Objektnummer Date other_cols Year Month Day DoW Season Hour
TF-objNr Date
4259619 2001-01-07 00:00:00.000000000 0 4259619 1970-01-01 13:45:41.000014557 xx 2001 1 7 6 0 0
2001-01-08 00:00:00.000000000 0 4259619 1970-01-01 13:45:41.000014557 xx 2001 1 8 0 0 0
...
...
2017-08-30 00:00:00.000000000 0 4259619 1970-01-01 13:45:41.000014557 xx 2017 8 30 2 2 0
2017-08-31 00:00:00.000000000 0 4259619 1970-01-01 13:45:41.000014557 xx 2017 8 31 3 2 0
...
...
4185787 2014-10-16 06:18:56.000067086 2 4185787 2014-10-16 06:18:56.000067086 zz 2014 10 16 3 3 6
2014-10-17 06:18:56.000067086 2 4185787 2014-10-16 06:18:56.000067086 zz 2014 10 17 4 3 6
...
...
2017-08-31 06:18:56.000067086 2 4185787 2014-10-16 06:18:56.000067086 zz 2017 8 31 3 2 6
...
Thの次のコードは、それをしないが、減速するwaaaaayである(100の異なるレベル0のインデックスの6Hのように、私は9Kに取得する必要があります): それはこのようになりますここではなく、必要に応じて)誰もが疑問に思う場合
kk=0
for ind in df_test.index:
print("#############",kk-1)
inter=df_test.loc[ind]
if inter["Date"]< minff:
start=minff
else:
start=inter["Date"]
dt_index=pd.date_range(start=start,end=maxMD)
ind0=inter['TF-Objektnummer']
cc=0
for indd in dt_index:
inter2=pd.DataFrame(index= pd.MultiIndex.from_tuples([(ind0,indd)], names=['TF-objNr','Date']),columns=cols+["Year","Month","Day","DoW","Season","Hour"])
if cc%523==12:
print(cc)
inter2.loc[ind0,indd][cols]=inter[cols]
inter2.loc[ind0,indd]["Year"]=indd.year
mm=indd.month
inter2.loc[ind0,indd]["Month"]=mm
inter2.loc[ind0,indd]["Day"]=indd.day
inter2.loc[ind0,indd]["DoW"]=indd.dayofweek
inter2.loc[ind0,indd]["Hour"]=indd.round("h").hour
if mm in [12,1,2]:
inter2.loc[ind0,pd.to_datetime(indd)]["Season"]=0
elif mm in [3,4,5]:
inter2.loc[ind0,pd.to_datetime(indd)]["Season"]=1
elif mm in [6,7,8]:
inter2.loc[ind0,pd.to_datetime(indd)]["Season"]=2
else:
inter2.loc[ind0,pd.to_datetime(indd)]["Season"]=3
cc+=1
if kk==0:
df_timeser=inter2.copy()
kk+=1
else:
df_timeser=df_timeser.append(inter2)
if kk%500==100:
df_timeser.to_csv("/myDir/df_timeser"+str(kk)+"_"+str(ind0)+".csv",index=True)
kk+=1
、
印象的! tup1、mux、df.setindex [...]はそれぞれ約2分かかるので、私のdatafrmeは 'df_ts.shape' '(42847813,51) '!!! しかし、2つのタイプがあります。 muxの定義で2番目のmuxはtup1でなければなりません。 reindexはtup1の代わりにmuxを取るべきです。 新しい列を設定するためのiddアプローチの速度にも感心しています –
あなたは正しいです、ありがとう、ありがとう。私はそれを編集する。 – jezrael