2013-10-08 55 views
0

我正在对一些股票进行事件研究,这导致熊猫DataFrame中的列是股票股票代码(SPY,GOOG,AAPL等),指数是时间戳。 DataFrame内的单元格的值为NaN或1.我想根据事件DataFrame生成一个订单DataFrame。因为我想为每个单元格== 1创建一个订单,所以我认为applymap是合适的。但是,看起来使用applymap剥去了索引和列的单元格。我试了下面的代码:在DataFrame上使用applymap,但保留索引/列信息

def appendOrder(orders, value): 
    if value == 1: 
     index = ["Year", "Month", "Day", "Stock", "OrderType", "Amount"] 
     s = pd.Series(index=index) 
     s["Stock"] = value.index 

def createOrders(events): 
    columns = ["Year", "Month", "Day", "Stock", "OrderType", "Amount"] 

    orders = pd.DataFrame(columns=columns) 
    events.applymap(lambda x: appendOrder(orders,x)) 

上面的代码在appendOrder方法中断了,因为value没有索引。

有没有办法在datamap上使用applymap时保留索引和列信息?

编辑

这里是事件数据框的一个片段:

     SPY GOOG AAPL XOM 
2013-10-1-16:00:00 NaN  1  NaN  1 
2013-10-2-16:00:00 NaN NaN  NaN  NaN 
2013-10-3-16:00:00 NaN NaN  NaN  NaN 
2013-10-4-16:00:00 1  NaN  NaN  NaN 
2013-10-5-16:00:00 NaN NaN  NaN  NaN 
2013-10-6-16:00:00 1  NaN  1  NaN 
2013-10-7-16:00:00 NaN NaN  NaN  NaN 
2013-10-8-16:00:00 NaN 1  NaN  NaN 

我想打开上述事件数据框到下面的订单数据框:

 Year  Month Day Stock OrderType Amount 
0 2013  10  1 GOOG  Buy   100 
1 2013  10  1 XOM  Buy   100 
2 2013  10  4 SPY  Buy   100 
3 2013  10  6 SPY  Buy   100 
4 2013  10  6 AAPL  Buy   100 
5 2013  10  8 GOOG  Buy   100 

我希望能让它更清楚一些。

+0

您可以发布您的数据样本以及您希望输出的样子吗?我不确定applymap是你想要的。 – TomAugspurger

回答

0

为大熊猫操作的基础是所谓的stack

df.stack() 
Out[25]: 
2013-10-1-16:00:00 GOOG 1 
        XOM  1 
2013-10-4-16:00:00 SPY  1 
2013-10-6-16:00:00 SPY  1 
        AAPL 1 
2013-10-8-16:00:00 GOOG 1 

工作,并从上面的数据框堆叠调整你的数据是直接的。您可以按照重置索引的方式进行操作,将其拆分为年份日日期列,然后将数学运算现在放在单个列中的非NaN数据中。