python - Pandas 数据帧处理中的关键错误

标签 python 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

我正在循环一个静态数据数据框,它包含我宇宙中的每个名字,我遍历它,然后每天为每个名字遍历(在这个例子中,名字是 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

关于python - Pandas 数据帧处理中的关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39603571/

相关文章:

python - Project Euler #8 Python,我看不出代码有什么问题

python - 列表列表转换为 pandas DataFrame

python - Py_InitModule4 与 Djapian/Xapian

python - 识别连续的数据序列并计算其长度

python - 是否可以在 django 中通过 URL 查询文件?

python - 如何将 Format 对象应用于 pandas 中的索引值

python - Pandas DF去除重名

python - 如何将矩阵转换为 Pandas 数据框

python - 如何根据列值拆分数据框,对字符串值进行排序或分组?

python - Anaconda 加速 check_cuda()