将值作为while循环生成的行添加到pd.dataframe

时间:2019-12-27 14:44:39

标签: python-3.x pandas

我遇到了一个用Python编写我的第一个代码的问题。我有一个从while循环生成值的代码。我的目标是建立包含诸如({['Date','Rev Growth','EPS LTM','DPS LTM','EPS Growth LTM','EPS Growth - NTM','EV/EBITDA - LTM','PE LTM','PE NTM','PEG','FCF Yield NTM','Div Yield'])之类的列标题的DataFrame,然后添加由循环生成的值。我正在使用print()函数获取值,这意味着循环工作正常,但是我与数据框部件堆叠在一起。

 while count < today_new:
    count = count + relativedelta(months=+i)

    gra1 = ek.get_data(instruments=mylist2,fields=field1, parameters=param)[0].iloc[0][1]
    gra2 = ek.get_data(instruments=mylist2,fields=field2, parameters=param)[0].iloc[0][1]
    gra3 = ek.get_data(instruments=mylist2,fields=field3, parameters=param)[0].iloc[0][1]
    if np.isnan(gra3):
           gra3 = "0"
    else:
        gra3
    gra4 = ek.get_data(instruments=mylist2,fields=field4, parameters=param1)[0].iloc[0][1]
    gra5 = ek.get_data(instruments=mylist2,fields=field5, parameters=param)[0].iloc[0][1]
    gra6 = ek.get_data(instruments=mylist2,fields=field6, parameters=param1)[0].iloc[0][1] / ek.get_data(instruments=mylist2,fields=field6_1, parameters=param)[0].iloc[0][1]
    if np.isnan(gra6):
           gra6 = "0"
    else:
        gra6
    gra7 = ek.get_data(instruments=mylist2,fields=field7, parameters=param)[0].iloc[0][1]
    if np.isnan(gra7):
           gra7 = "0"
    else:
        gra7
    gra8 = ek.get_data(instruments=mylist2,fields=field8, parameters=param2)[0].iloc[0][1]
    if np.isnan(gra8):
           gra8 = "0"
    else:
        gra8
    gra9 = ek.get_data(instruments=mylist2,fields=field9, parameters=param2)[0].iloc[0][1]
    if np.isnan(gra9):
           gra9 = "0"
    else:
        gra9
    gra10 = ek.get_data(instruments=mylist2,fields=field10, parameters=param2)[0].iloc[0][1]
    if np.isnan(gra10):
           gra10 = "0"
    else:
        gra10
    gra11 = ek.get_data(instruments=mylist2,fields=field11, parameters=param1)[0].iloc[0][1]
    if np.isnan(gra11):
           gra11 = "0"
    else:
        gra11

1 个答案:

答案 0 :(得分:0)

如果我理解正确,我将在字典中收集所有标头及其值,并构建数据框。在这里,我将向您展示一个数据帧,其中的单行包含一些标头和随机值。我会假设:

import pandas as pd
Count = 5
gar1 = 6
gar2 = 7
dictionary_to_store = {}
dictionary_to_store['Date'] = Count
dictionary_to_store['Rev Growth'] = gar1
dictionary_to_store ['EPS LTM'] = gar2
df = pd.DataFrame.from_dict(dictionary_to_store, orient = 'index').T

将在一行中为您提供数据框,如下所示

   Date  Rev Growth  EPS LTM
0     5           6        7

但是当您要在数据框中添加索引时,可以使用以下方法

import collections
from collections import defaultdict
d = defaultdict(dict)
d['a']['b'] = 1
d['c']['e'] = 4
d['f']['g'] = 7
df = pd.DataFrame.from_dict(d, orient='index')

它给出:

     b    e    g
a  1.0  NaN  NaN
c  NaN  4.0  NaN
f  NaN  NaN  7.0

或者您始终可以进行转置来翻转数据框

pd.DataFrame.from_dict(d, orient='index').T

会给予

     a    c    f
b  1.0  NaN  NaN
e  NaN  4.0  NaN
g  NaN  NaN  7.0

我认为在您的情况下,您需要使用第二种方法并在while循环之前初始化字典并保持其更新。您的键将是标题,值是Count,gar1 ...总是很好地显示所需的输出以及您的问题中的示例输入数据。请告诉我是否有帮助。

#您能否运行以下

dictionary_to_store = {}
while count < today_new:
    count = count + relativedelta(months=+i)
    dictionary_to_store['Date'] = count

    gra1 = ek.get_data(instruments=mylist2,fields=field1, parameters=param)[0].iloc[0][1]

    dictionary_to_store['Rev growth'] = gar1

    gra2 = ek.get_data(instruments=mylist2,fields=field2, parameters=param)[0].iloc[0][1]

    dictionary_to_store['column3'] = gar2

    gra3 = ek.get_data(instruments=mylist2,fields=field3, parameters=param)[0].iloc[0][1]



    if np.isnan(gra3):
           gra3 = "0"
    else:
        gra3
        dictionary_to_store['column4'] = gar3

    gra4 = ek.get_data(instruments=mylist2,fields=field4, parameters=param1)[0].iloc[0][1]

    dictionary_to_store['column5'] = gar4

    gra5 = ek.get_data(instruments=mylist2,fields=field5, parameters=param)[0].iloc[0][1]

    dictionary_to_store['column6'] = gar5

,依此类推。然后使用

构建数据框
df = pd.DataFrame.from_dict(dictionary_to_store, orient = 'index').T

您可能只会得到最后一行,因为每次运行循环时,字典都会使用每个键中的最后一个值进行更新。要摆脱这种情况,您可能需要使用您拥有的可迭代对象。这可以通过使用我上面提到的第二种方法来完成。例如,对于“日期”列,您可以执行以下操作

dictionary_to_store = defaultdict(dict)

dictionary_to_store['your iterable']['Date'] = count

使用所提供的代码,我不确定您可以迭代使用什么。您已经使用了一些额外的函数调用relativedelta,在其中更新了“ i”,不确定是什么。