【问题标题】:How to add and remove single-index dataframe rows to and from a MultiIndex dataframe?如何在 MultiIndex 数据帧中添加和删除单索引数据帧行?
【发布时间】:2018-08-30 12:11:10
【问题描述】:

我有一个 df,Stock_to_buy,它告诉我们在给定日期购买哪只股票。索引列是Date

             Symbol   Shares
Date         
2018-01-01   AAOI     20
2018-01-03   FB       34
2018-01-05   AMZN     5
2018-01-07   SQ       25
2018-01-08   TPL      31

我创建了另一个 df,Portfolio。我想解决方案要求它是 MultiIndex,所以索引列是 DateSymbol

                       Shares
Date         Symbol
2018-01-01   NaN       NaN
2018-01-02   NaN       NaN
2018-01-03   NaN       NaN
2018-01-04   NaN       NaN
2018-01-05   NaN       NaN
2018-01-06   NaN       NaN
2018-01-07   NaN       NaN
2018-01-08   NaN       NaN

我想根据Stock_to_buy 更新Portfolio:如果符号在给定日期位于Stock_to_buy 中,则应在该日期将其作为一行添加到Portfolio,并应保留在那里在后续日期直到 Sell_Next_Day 变为 True,在这种情况下,应从后续日期中删除 Symbol 的行。下面是一个示例,我希望 Portfolio 如何工作。

                      Shares   Sell_Next_Day
Date         Symbol
2017-12-31   NaN      NaN      NaN 
---------------------------------------------        
2018-01-01   AAOI     20       False
---------------------------------------------
2018-01-02   AAOI     20       False
---------------------------------------------
2018-01-03   AAOI     20       False
             FB       34       False
---------------------------------------------
2018-01-04   AAOI     20       False
             FB       34       False
---------------------------------------------
2018-01-05   AAOI     20       False
             FB       34       False
             AMZN     5        False
---------------------------------------------
2018-01-06   AAOI     20       True           # AAOI will be sold next day
             FB       34       False
             AMZN     5        False
---------------------------------------------
2018-01-07   FB       34       False
             AMZN     5        True           # AMZN will be sold next day
             SQ       25       False
---------------------------------------------
2018-01-08   FB       34       False
             SQ       25       False
             TPL      31       False

我该怎么做?任何帮助表示赞赏。

【问题讨论】:

  • 我不明白您创建的第二个 DataFrame 的目的。另外,我们如何知道sell_next_day 何时变为 True?
  • 它的日期条目比Stock_to_buy 多。 Sell_Next_Day 是根据开、高、低、关计算的。我只是想让示例变得简单。
  • 是的,我可以看到,但不清楚为什么它有更多,也不清楚你从哪里得到sell_next_day
  • Stock_to_buy 是对巨大数据框的操作的结果,我希望 Portfolio 成为单独的一个。 Sell_Next_Day 将根据包含在 Stock_to_buy 行中的其他指标进行计算。
  • 我不确定这是不是最好的设置。除此之外,您基本上想使用df.appendDateSymbolShares 添加到您的第二个df。

标签: python pandas multi-index


【解决方案1】:

我不确定这是否正是您想要的,但我认为它会有所帮助。 数据:

Stock_to_buy = pd.DataFrame(data=[
                                  ['2018-01-01','AAOI','20'],
                                  ['2018-01-03', 'FB', 34],
                                  ['2018-01-05', 'AMZN' , 5],
                                  ['2018-01-07', 'SQ', 25],
                                  ['2018-01-08', 'TPL' ,31]
                            ], columns=['Date', 'Symbol','Shares']
                           )
Stock_to_buy.Date = pd.to_datetime(Stock_to_buy.Date)

第 1 步。 填写所有可能的值。

END_DATE = Stock_to_buy.sort_values('Date').Date.values[-1]
def fill(df):
    index = pd.date_range(start=df.Date.values[0], end=END_DATE)
    return pd.DataFrame(data=[[1]*len(index)], index=index)

Portfolio = Stock_to_buy.groupby(['Symbol', 'Shares']
                    ).apply(fill).reset_index(
                    ).drop([i for i in range(0,8)], 1).rename(
                    columns={'level_2': 'Date'}).set_index('Date')

输出:

           Symbol Shares
Date                    
2018-01-01   AAOI     20
2018-01-02   AAOI     20
2018-01-03   AAOI     20
2018-01-04   AAOI     20
2018-01-05   AAOI     20
2018-01-06   AAOI     20
2018-01-07   AAOI     20
2018-01-08   AAOI     20
2018-01-05   AMZN      5
2018-01-06   AMZN      5
2018-01-07   AMZN      5
2018-01-08   AMZN      5
2018-01-03     FB     34
2018-01-04     FB     34
2018-01-05     FB     34
2018-01-06     FB     34
2018-01-07     FB     34
2018-01-08     FB     34
2018-01-07     SQ     25
2018-01-08     SQ     25
2018-01-08    TPL     31

第 2 步。如果我们有 Sell_Next_Day 列,例如:

Sell_Next_Day = pd.Series([False, False, False, False, False, True, False, 
                           False, False, False, True, False, False, False, False,
                           False,False,False, False, False, False],
                           name='Sell_Next_Day')

然后我们可以加入它们,并在SymbolSell_Next_Day 中具有 True 值之后删除所有下一个 raws。

def drop_dates(df):
    if df.Sell_Next_Day.any():
        res = df[df.Date <= df[df.Sell_Next_Day == True].Date.values[0]]
    else:
        res = df
    return res

Portfolio = Portfolio.reset_index().join(Sell_Next_Day
                            ).groupby('Symbol'
                            ).apply(drop_dates).set_index('Date')

输出:

           Symbol Shares  Sell_Next_Day
Date                                   
2018-01-01   AAOI     20          False
2018-01-02   AAOI     20          False
2018-01-03   AAOI     20          False
2018-01-04   AAOI     20          False
2018-01-05   AAOI     20          False
2018-01-06   AAOI     20           True
2018-01-05   AMZN      5          False
2018-01-06   AMZN      5          False
2018-01-07   AMZN      5           True
2018-01-03     FB     34          False
2018-01-04     FB     34          False
2018-01-05     FB     34          False
2018-01-06     FB     34          False
2018-01-07     FB     34          False
2018-01-08     FB     34          False
2018-01-07     SQ     25          False
2018-01-08     SQ     25          False
2018-01-08    TPL     31          False

这是你想要的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2019-08-12
    • 2021-12-01
    • 2015-04-24
    • 2021-01-12
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多