首页 > 解决方案 > 按存储在不同列中的复合群组排序

问题描述

假设我有一个数据框,其中 3 列包含参数。因此所有可能的群组都是组合:假设列有“duck”、“cat”、“dog”、另一个“white”、“grey”、“black”,最后一个“small”、“big”。因此,群组是小灰鸭、大黑猫等。

因此,如何按存储在其中的所有可能的群组对数据框进行分组?我将需要它来计算所有群组的某些值。谢谢你。

标签: pandascombinatorics

解决方案


您必须以某种方式将您的系列拆分为独特的元素(无论是列表还是 pandas.Series)。

例如 :

cols1 = set(df['col1'])
cols2 = set(df['col2'])
cols3 = set(df['col3'])
df = pd.DataFrame([[x,y,z] for x in cols1 for y in cols2 for z in cols3], columns=['col1', 'col2', 'col3'])
df.drop_duplicates(keep="first", inplace=True)

您也可以使用循环(在 df.columns.tolist() 上循环)并将系列值存储到字典中来执行此操作。

(这有助于您收集所有可能的群组组合)

编辑 :

要在您的第一个数据框中对组合进行分组,您可以执行以下操作:

df.groupby(['col1', 'col2', 'col3'])['col4'].mean()

请参阅pandas.groupby的文档

编辑 2:

获得所有组合的另一种方法可能是(仅使用熊猫):

from functools import reduce
cols = [df[[col]].drop_duplicates(keep='first') for col in ['col1', 'col2', 'col3']]
for sub_df_col in cols:
  sub_df_col['CARTESIAN_PRODUCT'] = 1 #you now have a new column which the same value everywhere
df2 = reduce(lambda  left,right: pd.merge(left,right,on=['CARTESIAN_PRODUCT'], how='outer'), cols).drop('CARTESIAN_PRODUCT', axis=1)

归功于 @ everestial007的 reduce/lambda 解决方案


推荐阅读