【问题标题】:Check all rows in a Pandas group are identical检查 Pandas 组中的所有行是否相同
【发布时间】:2021-10-29 09:58:04
【问题描述】:

我有一个 MultiIndexed 数据框,我正在分解其中一个索引。该数据如下所示:

some_vals = [['blue', 'green']] * 3 + [['orange', 'yellow']] * 2 + [['violet', 'fuligin']] * 5

some_index = pd.MultiIndex.from_tuples([('foo', 1)] * 3 + [('bar', 4)] * 2 + [('baz', 7)] * 5,
                                       names=('wibble', 'wobble'))

some_data = pd.DataFrame(some_vals, index=some_index, columns=('quality', 'aspect'))

在我的实际数据中,如some_data,给定wibble 的所有 应该是相同的。为了以编程方式验证这一点,我这样做:

grouped.apply(lambda g: g.value_counts().count() == 1)

# wibble
# bar    True
# baz    True
# foo    True
# dtype: bool

这没问题,但是当我将它吹到我的实际数据集时,它似乎很慢,大约 5000 行需要几秒钟。这看起来很慢,让我觉得必须有一种更有效(并且可能更自然)的方式来实现这一点。

使用nunique 并不能完全满足我的需求,这很遗憾,因为它更快:

grouped.apply(lambda g: (g.nunique() == 1)).all()
# quality    True
# aspect     True
# dtype: bool

我想捕获行不一致的组,但这会按列进行。

【问题讨论】:

标签: pandas-groupby


【解决方案1】:

一个小小的工作让我找到了这个解决方案,我想记录下来以供后人使用:

def all_same(df) -> bool:
    return (df.nunique() == 1).all()

grouped.apply(all_same)
# wibble
# bar    True
# baz    True
# foo    True
# dtype: bool

性能提高了大约 40%,但在我公认的贫血笔记本电脑上,5000 行仍然需要大约 1 秒的时间。

【讨论】:

  • 我觉得你可以用.nunique().eq(1)代替.apply(all_same)
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 2019-05-25
  • 2022-12-20
  • 1970-01-01
  • 2015-07-05
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多