您如何根据布尔值排列对 pandas 数据帧行进行分组?

How do you group pandas dataframe rows based on permutation of booleans?

假设有一个 pandas 数据框,其中包含五列和 n 行。每列都有一个布尔值。

数学上说布尔值应该有 32 种排列。

如何通过与每一行相关联的布尔值的排列对它们进行分组,以便我可以获得每个组或 return 其他属性的计数?

例如,我如何找出与 TTTTT 或 TTTTF 或我感兴趣的任何排列关联的行数?

有几种方法可以做到这一点。一种方法是同时按您关心的所有列进行分组。如果需要计数,可以对结果调用 GroupBy.count 方法:

df.groupby(['c1', 'c2', 'c3', 'c4', 'c5']).count()

或者更简单地说,如果所有列都感兴趣:

df.groupby(list(df.columns)).count()

您还可以将布尔值转换为数字,并对其进行分组:

df['Num'] = (df.to_numpy() << [4, 3, 2, 1, 0]).sum(0)
df.groupby('Num').count()

不需要创建新列的更通用的解决方案可以使用 value_counts

names = ['c1', 'c2', 'c3', 'c4', 'c5']
pd.Series((df[names].to_numpy() << np.arange(len(names))).sum(0)).value_counts()

你可以很方便地重写为

pd.Series.value_counts((df[names].to_numpy() << np.arange(len(names))).sum(0))