【问题标题】:How to drop level 1 indices based on conditions for a MultiIndex DataFrame如何根据 MultiIndex DataFrame 的条件删除 1 级索引
【发布时间】:2021-11-23 12:52:58
【问题描述】:

我的目标是根据交易量减少两只股票/股票代码(或底部十分位)(针对每个 0 级指数日期的交易量最低的 2 只股票/股票代码(第 1 级)删除整行)

DataFrame 已经按体积排序,因此对于每个日期,它都按体积升序排序。所以 DataFrame 可能看起来像(已缩短为 5 个股票而不是 20 个) : 数据框示例: '''

Date        Ticker  col1 col2 col3 Volume
2020-01-01  stock1   -    -    -    5
            stock2   -    -    -    10
            stock3   -    -    -    20
            stock4   -    -    -    40
            stock5   -    -    -    43
2020-02-01  stock3   -    -    -    7
            stock5   -    -    -    14
            stock1   -    -    -    33
            stock2   -    -    -    50
            stock4   -    -    -    52

对于 0 级索引日期“2020-01-01”,我想删除 stock1 和 stock2,但对于下一级索引日期“2020-02-01”,我想删除新的最低 2分别是 stock3 和 stock5。

注意:真正的 DataFrame 会更大,不止 5 只股票,而且还会持续很多个月

到目前为止,我已经尝试使用qcut 添加一个等分列(因为我的真正目标是为 20 只股票做此操作),它会自动给我按数量计算的最低两个值,但我无法为每个 0 级日期复制(仅在一个日期成功,不知道如何为每个 0 级日期复制)。

我也尝试了nsmallestnlargest,但由于这是一个DataFrame,所以遇到了错误。

您对我如何完成这项任务有任何建议吗?我觉得好像我走在正确的道路上,但我缺少一些基本的东西。任何见解都值得赞赏!

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    由于您的 DataFrame 已按日期和数量排序,您可以通过将任何答案调整为 Python: Pandas - Delete the first row by group 来删除每个日期组的前 2 行。例如:

    # Create input data based on your example
    d = {'Date': 5 * ['2020-01-01'] + 
                 5 * ['2020-02-01'],
       'Ticker': ['stock1', 'stock2', 'stock3', 'stock4', 'stock5',
                  'stock3', 'stock5', 'stock1', 'stock2', 'stock4'],
         'col1': 10 * ['-'],
       'Volume': [5, 10, 20, 40, 43, 7, 14, 33, 50, 52]}
    
    df = pd.DataFrame(d)
    
    # Get the first and second rows of each date group
    to_del = df.groupby('Date', as_index=False).nth([0, 1])
    
    # Intentionally duplicate the first and second rows of each date
    # group, then remove them with drop_duplicates with keep=False to 
    # drop *all* duplicated rows without keeping first occurrences
    res = pd.concat([df, to_del]).drop_duplicates(keep=False)
    
    print(res)
    
             Date  Ticker col1  Volume
    2  2020-01-01  stock3    -      20
    3  2020-01-01  stock4    -      40
    4  2020-01-01  stock5    -      43
    7  2020-02-01  stock1    -      33
    8  2020-02-01  stock2    -      50
    9  2020-02-01  stock4    -      52
    

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 2020-05-14
      • 1970-01-01
      • 2016-01-18
      • 2021-10-12
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多