【问题标题】:Multiindexed Pandas groupby, ignore a level?Multiindexed Pandas groupby,忽略一个级别?
【发布时间】:2014-06-24 23:39:02
【问题描述】:

我正在一个类似于这个的多索引 DataFrame 上运行 groupby 操作:

                                        0         1    ...
categories features subfeatures                    
cat1       feature1 subfeature1 -0.224487 -0.227524
                    subfeature2 -0.591399 -0.799228
           feature2 subfeature1  1.190110 -1.365895    ...
                    subfeature2  0.720956 -1.325562
cat2       feature1 subfeature1  1.856932       NaN
                    subfeature2 -1.354258 -0.740473
           feature2 subfeature1  0.234075 -1.362235    ...
                    subfeature2  0.013875  1.309564
cat3       feature1 subfeature1       NaN       NaN
                    subfeature2 -1.260408  1.559721    ...
           feature2 subfeature1  0.419246  0.084386
                    subfeature2  0.969270  1.493417

...                    ...               ...

并且可以使用以下代码生成:

import pandas as pd, numpy as np
np.random.seed(seed=90)
results = np.random.randn(3,2,2,2)
results[2,0,0,:] = np.nan
results[1,0,0,1] = np.nan
results = results.reshape((-1,2))
index = pd.MultiIndex.from_product([["cat1", "cat2", "cat3"],
                                    ["feature1", "feature2"], 
                                    ["subfeature1", "subfeature2"]], 
                                   names=["categories", "features", "subfeatures"])
df = pd.DataFrame(results, index=index)

我试图只选择两个子特征数组之间的最大差异大于某个阈值的组,但我遇到了groupby 的问题

df.groupby(level=['categories','features'])

这给了我以下组:

{('cat1', 'feature1'): [('cat1', 'feature1', 'subfeature1'),
  ('cat1', 'feature1', 'subfeature2')],
 ('cat1', 'feature2'): [('cat1', 'feature2', 'subfeature1'),
  ('cat1', 'feature2', 'subfeature2')],
 ('cat2', 'feature1'): [('cat2', 'feature1', 'subfeature1'),
  ('cat2', 'feature1', 'subfeature2')],
 ('cat2', 'feature2'): [('cat2', 'feature2', 'subfeature1'),
  ('cat2', 'feature2', 'subfeature2')],
 ('cat3', 'feature1'): [('cat3', 'feature1', 'subfeature1'),
  ('cat3', 'feature1', 'subfeature2')],
 ('cat3', 'feature2'): [('cat3', 'feature2', 'subfeature1'),
  ('cat3', 'feature2', 'subfeature2')]}

有什么方法可以分组以使groupby 函数忽略子功能级别?原因是我需要将subfeature1subfeature2 放在一起,在不同的组中它们毫无价值。

理想情况下,我希望groupby 返回如下内容:

{('cat1', 'feature1'): [('cat1', 'feature1')],
 ('cat1', 'feature2'): [('cat1', 'feature2')],
 ('cat2', 'feature1'): [('cat2', 'feature1')],
 ('cat2', 'feature2'): [('cat2', 'feature2')],
 ('cat3', 'feature1'): [('cat3', 'feature1')],
 ('cat3', 'feature2'): [('cat3', 'feature2')],

我该怎么做?

【问题讨论】:

    标签: python filter pandas


    【解决方案1】:
    In [20]: df.reset_index(level='subfeatures').groupby(level=['categories','features']).groups
    Out[20]: 
    {('cat1', 'feature1'): [('cat1', 'feature1'), ('cat1', 'feature1')],
     ('cat1', 'feature2'): [('cat1', 'feature2'), ('cat1', 'feature2')],
     ('cat2', 'feature1'): [('cat2', 'feature1'), ('cat2', 'feature1')],
     ('cat2', 'feature2'): [('cat2', 'feature2'), ('cat2', 'feature2')],
     ('cat3', 'feature1'): [('cat3', 'feature1'), ('cat3', 'feature1')],
     ('cat3', 'feature2'): [('cat3', 'feature2'), ('cat3', 'feature2')]}
    

    【讨论】:

    • 值之间是否可以不重复?例如,('cat1', 'feature1') 在值列表中包含两次。
    • 你在用这个做什么?你几乎不需要直接使用.groups。他们没有重复,每组有 2 行。
    • 我正在对子特征列右侧的数字数组进行比较。我想将subfeature1 数组与subfeature2 数组在每个(猫,功能)组中进行一次比较。
    • 基本上问题归结为:您可以通过屏蔽索引进行分组吗? subfeature 描述符在分组时应被忽略,但对于过滤器功能很重要。子特征表示特征的标准属性,在任何地方都相同。
    • 那么您可以简单地访问应用中的子功能字段。
    【解决方案2】:

    在 Jeff 的帮助下,我设法找到了一个可行的解决方案。

    def f(x):
        tmp = x.set_index('subfeatures')
        a = (tmp.xs('subfeature1')-tmp.xs('subfeature2')).abs().max()
        return a > 1
    
    df.reset_index('subfeatures').groupby(level=['categories', 'features']).filter(f).set_index('subfeatures', append=True)
    

    我基本上忽略了 subfeatures 进行分组,然后暂时将其添加回过滤器函数中,但这会丢失,所以我在过滤器函数完成后完成它。

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 2019-06-03
      • 2018-04-06
      • 2019-02-06
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2016-05-07
      • 2017-01-11
      相关资源
      最近更新 更多