首页 > 解决方案 > 如何简单地设置数据框以包含结果?

问题描述

query并且get_fundamentals是一些APP的api,指出是哪个无所谓api
下面是我使用数据框的片段。

code = "some"
caldate = [datetime.date(2003, 12, 31),datetime.date(2004, 12, 31),
           datetime.date(2005, 12, 31), datetime.date(2006, 12, 31)]
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    print(y)

输出如下:

Empty DataFrame
Columns: [market_cap]
Index: []
Empty DataFrame
Columns: [market_cap]
Index: []
   market_cap
0    215.2808
   market_cap
0    828.9395

我希望创建一个包含所有输出的数据框。

container
   market_cap
0         NaN
1         NaN
2    215.2808
3    828.9395

type(container)
<class 'pandas.core.frame.DataFrame'>

我尝试使用 concat(失败):

result = pd.DataFrame(columns=['market_cap'])
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    pd.concat([result,y],axis = 0)

输出:

Empty DataFrame
Columns: [market_cap, market_cap]
Index: []
Empty DataFrame
Columns: [market_cap, market_cap]
Index: []
   market_cap  market_cap
0         NaN    215.2808
   market_cap  market_cap
0         NaN    828.9395
>>> result
Empty DataFrame
Columns: [market_cap]
Index: []

另一个尝试(失败):

result = pd.DataFrame(columns=['market_cap'])
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)
    result = result.append(y)

打印结果看看我得到了什么:

result
   market_cap
0    215.2808
0    828.9395

期望的结果:

   market_cap
0         NaN
1         NaN
2    215.2808
3    828.9395

前两个空的丢失了。

另一个尝试(成功):设置一个列表以添加输出,然后将其分配给数据框。

result = []
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate)['market_cap']
    if y.empty:
        result.append(numpy.nan)
    else:
        result.append(y[0])

container = pd.DataFrame()
container['market_cap'] = result 

也许有一种更简单、更 Pythonic 的方式来实现我的期望。

@YOLO,print(result) 根据您的代码。

result
                                        market_cap
0  Empty DataFrame
Columns: [market_cap]
Index: []
1  Empty DataFrame
Columns: [market_cap]
Index: []
2                         market_cap
0    215.2808
3                         market_cap
0    828.9395

显示结果中的每个元素。

>>> result["market_cap"][0]
Empty DataFrame
Columns: [market_cap]
Index: []
>>> result["market_cap"][1]
Empty DataFrame
Columns: [market_cap]
Index: []
>>> result["market_cap"][2]
   market_cap
0    215.2808
>>> result["market_cap"][3]
   market_cap
0    828.9395

我的期望:

>>> result["market_cap"][0]
nan
>>> result["market_cap"][1]
nan
>>> result["market_cap"][2]
215.2808
>>> result["market_cap"][3]
828.9395

标签: pythonpandasdataframeconcat

解决方案


你很亲密。类似于你最后一步的东西应该可以工作:

result = [] 
for curdate in caldate:
    q = query(valuation.market_cap).filter(valuation.code == code)
    y = get_fundamentals(q,date=curdate) # assuming this returns a NaN or some numeric
    result.append(y)

result = pd.DataFrame(result, columns=['market_cap'])

推荐阅读