2016-09-20 21 views
3

私はデータフレームstockDataを持っています。一部の例では、次のようになります。データフレーム処理のキーエラー

Name: BBG.XCSE.CARLB.S_LAST_ADJ BBG.XCSE.CARLB.S_FX ..... 
date 
2015-09-11 0.1340       490.763 
2015-09-14 0.1340       484.263 
2015-09-15 0.1340       484.755 
2015-09-16 0.1340       507.703 
2015-09-17 0.1340       514.104 ..... 

各列のデータ型、DTYPEがありますのfloat64

私は宇宙のすべての名前をcontans静的データのデータフレームをループしていると私はこれを反復処理し、反復処理をスルー名前はそれぞれ毎日(この例では名前はBBG.XCSE.CARLB.Sですが、実際には何百もの名前があります)、カラム 'name_LAST_ADJ'をとり、カラム 'name_FX'を掛けます。しかし、時には(名の履歴がないため)、データが存在せず、名前の欄にはしていないので、私はキーエラーが表示さ

for i, row in staticData.iterrows(): 

     unique_id = i 

     #Create new column for the current name that will take the result of the following calculation 
     stockData[unique_id+"_LAST_ADJ_EUR"] = np.nan 

     #Perform calculation - this is where I get the KeyError when there is no data in the name_ADJ_LAST column. 
     stockData[unique_id+"_LAST_ADJ_EUR"] = stockData[unique_id+"_FX"]*stockData[unique_id+"_LAST_ADJ"] 


    return stockData 

:私はのようなルックスを使用しています
コードデータフレーム。私はname_LAST_ADJ_EURと呼ばれる追加の列を作成しようとしていますし、データがあるとき、それはのようになります。上記のコードでは

:データがある場合に

Name: BBG.XCSE.CARLB.S_LAST_ADJ BBG.XCSE.CARLB.S_FX  BBG.XCSE.CARLB.S_LAST_ADJ_EUR 
    date 
    2015-09-11 0.1340      490.763    65.762242 
    2015-09-14 0.1340      484.263    64.891242 
    2015-09-15 0.1340      484.755    64.95717 
    2015-09-16 0.1340      507.703    68.032202 
    2015-09-17 0.1340      514.104    68.889936 

とname_LAST_ADJ列内のデータは方法はありません私は、以下のものを使用して試してみました

Name:  BBG.XCSE.CARLB.S_LAST_ADJ_EUR 
    date 
    2015-09-11 NaN  
    2015-09-14 NaN  
    2015-09-15 NaN  
    2015-09-16 NaN   
    2015-09-17 NaN   

stockData[unique_id+"_LAST_ADJ_EUR"] = np.where((stockData[unique_id+"_LAST_ADJ"] == np.nan),stockData[unique_id+"_LAST_ADJ_EUR"]='NaN',stockData[unique_id+"_LAST_ADJ_EUR"] = stockData[unique_id+"_FX"] * stockData[unique_id+"_LAST_ADJ"]) 
、それがどのように見えるので、彼の列のためのNaN出力を生成

これは、列があってもそれを参照する列がない場合には問題なく、KeyError例外がスローされます。

ずっとあなたforループで

答えて

1

に感謝すべてのヘルプは、あなたも一度のようにそれをすべて行うことができ、forループ内でそれをやっている間、最も効率的なおそらく

for uid, row in staticData.iterrows(): 
    if uid not in stockData.columns: 
     stockData[uid + "_FX"] = np.nan 
     stockData[uid + "_LAST_ADJ"] = np.nan 

    # continue with what you have: 
    # no longer needed 
    #stockData[uid+"_LAST_ADJ_EUR"] = np.nan 

    stockData[uid+"_LAST_ADJ_EUR"] = stockData[uid+"_FX"]*stockData[uid+"_LAST_ADJ"] 

に似何かをされて追加してみてください:たとえば

stockData = pd.concat([stockData, pd.DataFrame(columns=staticData.index)]) 

df = pd.DataFrame(np.random.rand(10, 3), columns=list('abc')) 
      a   b   c 
0 0.627303 0.183463 0.714470 
1 0.458124 0.135907 0.515340 
2 0.629373 0.725247 0.306275 
3 0.113927 0.259965 0.996407 
4 0.321131 0.734002 0.766044 
5 0.740858 0.238741 0.531810 
6 0.063990 0.974056 0.178260 
7 0.977651 0.047287 0.435681 
8 0.972060 0.606288 0.600896 
9 0.250377 0.807237 0.153419 

pd.concat([df, pd.DataFrame(columns=list('abcde'))]) 
      a   b   c d e 
0 0.627303 0.183463 0.714470 NaN NaN 
1 0.458124 0.135907 0.515340 NaN NaN 
2 0.629373 0.725247 0.306275 NaN NaN 
3 0.113927 0.259965 0.996407 NaN NaN 
4 0.321131 0.734002 0.766044 NaN NaN 
5 0.740858 0.238741 0.531810 NaN NaN 
6 0.063990 0.974056 0.178260 NaN NaN 
7 0.977651 0.047287 0.435681 NaN NaN 
8 0.972060 0.606288 0.600896 NaN NaN 
9 0.250377 0.807237 0.153419 NaN NaN 
1

私はその後、乗算が私のために

df.LAST_ADJ * df.FX 

enter image description here

シンプルなトリッキーな部分は、それを挿入しているとなっ

tups = df.columns.to_series() \ 
     .str.extract(r'(.*)_(LAST_ADJ|FX)', expand=False) \ 
     .apply(tuple, 1).tolist() 

df.columns = pd.MultiIndex.from_tuples(tups).swaplevel(0, 1) 

df 

enter image description here

マルチインデックスにあなたの列を解析することから始めたいですで戻る。私はこの

pd.concat([df, pd.concat([df.LAST_ADJ.mul(df.FX)], axis=1, keys=['EUR'])], axis=1) 

enter image description here

をしました
関連する問題