pandas - 按存储在不同列中的复合群组排序
问题描述
假设我有一个数据框,其中 3 列包含参数。因此所有可能的群组都是组合:假设列有“duck”、“cat”、“dog”、另一个“white”、“grey”、“black”,最后一个“small”、“big”。因此,群组是小灰鸭、大黑猫等。
因此,如何按存储在其中的所有可能的群组对数据框进行分组?我将需要它来计算所有群组的某些值。谢谢你。
解决方案
您必须以某种方式将您的系列拆分为独特的元素(无论是列表还是 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 解决方案
推荐阅读
- mysql - MySQL按所选表的数组值排序
- python-3.x - SolveSympy 无法求解的函数
- bash - WSL 和 bash 命令
- visual-studio - 在 Azure Devops 中引发 PR 之前强制开发人员运行单元测试项目
- python - 如何根据日期自动更改状态?(odoo 11)
- python - 嵌套操作的大 O 空间复杂度
- python - 如何从列中给出的多个标签中创建列表
- java - 选择时 Java SQL 更新值
- kubernetes - SSLError: ('The read operation timed out',) 尝试使用 Kubespray 部署 Kuberntes 时
- dart - 如何使文本垂直增长并截断?