【问题标题】:Filtering on Column by a Value That Changes Depending on an MultiIndex Level通过根据 MultiIndex 级别更改的值过滤列
【发布时间】:2018-11-14 04:46:39
【问题描述】:

复杂的标题,但很简单的问题。我有一个带有 MultiIndex 的 DataFrame:

我想要上面框架的行,但'Filter Column' 必须大于或等于下面filter_value 系列中的值。

filter_value = Series([1, 3], ['red', 'blue'])

这个玩具问题的正确解决方案是相同的数据框,但只剩下 (red, 2)(blue, 2)(blue, 3) 行。

为上述框架设置:

arrays = [['red', 'red', 'blue', 'blue', 'blue'], [1, 2, 1, 2, 3]]
idx = MultiIndex.from_arrays(arrays, names=['Color', 'Count'])

values = Series(2, idx, name='Value')
ratios = Series(range(5), idx, name='Filter Column')
df = concat([values, ratios], axis='columns')

【问题讨论】:

    标签: python pandas filter multi-index


    【解决方案1】:

    好像你需要get_level_values + map,然后使用值比较得到布尔过滤器df

    df[df['Filter Column'].values>=df.index.get_level_values(0).map(filter_value)]
    Out[108]: 
                 Value  Filter Column
    Color Count                      
    red   2          2              1
    blue  2          2              3
          3          2              4
    

    【讨论】:

    • @rhaskett 是的,因为你有多个索引并且 pandas 对索引敏感,所以我习惯使用这些值来保证安全,因为我通常也会分配 :-)
    【解决方案2】:

    你可以试试这个:

    pd.concat(df.align(filter_value.rename('filter'), level=0, axis=0), axis=1)\
      .loc[lambda x: x['Filter Column']>=x['filter']]
    

    输出:

                 Value  Filter Column  filter
    Color Count                              
    red   2          2              1       1
    blue  2          2              3       3
          3          2              4       3
    

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 2022-12-04
      • 1970-01-01
      • 2021-08-08
      • 2017-08-09
      • 2018-04-04
      • 2019-08-04
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多