首页 > 解决方案 > 如何根据 MultiIndex DataFrame 的条件删除 1 级索引

问题描述

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

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

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 只以上的股票大得多,而且还会持续很多个月

到目前为止,我已经尝试添加一个十分位列(因为我的真正目标是为 20 只股票执行此操作),使用qcut, 这将自动为我提供按数量计算的最低两个值,但我无法为每个 0 级日期复制(仅在一个日期成功,并且不确定如何为每个 0 级日期执行此操作)。

由于这是一个 DataFrame,我也尝试过nsmallest但遇到了错误。nlargest

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

标签: pythonpandasdataframemulti-index

解决方案


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

# 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

推荐阅读