[英]Key error in data-frame handling in Pandas
我有一個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
我正在循環一個靜態數據數據框,該數據框包含我的Universe中的每個名稱,然后我遍歷這個,然后每天為每個名稱迭代(在這個例子中,名稱是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列中沒有數據可以為列生成NaN輸出,如下所示:
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"])
如果有一個列,但沒有列引用它會拋出KeyError異常。
在你的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"]
雖然在for
循環中執行它可能是最有效的,但你也可以一次完成所有操作,如:
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
我首先將您的列解析為多索引
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
然后乘法變得簡單
df.LAST_ADJ * df.FX
對我來說棘手的部分是用'EUR'
插回來。 我這樣做了
pd.concat([df, pd.concat([df.LAST_ADJ.mul(df.FX)], axis=1, keys=['EUR'])], axis=1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.