Python 如何根据另一个变量的计数创建一个变量,并按某个键分组?

Python 如何根据另一个变量的计数创建一个变量,并按某个键分组?,python,pandas,Python,Pandas,我有一个包含标签列和任务ID列的数据集。每个任务ID有3行,每个任务ID的标签列中都有一些L1-L5值。我需要根据任务中这些标签的特定组合,为每个任务分配一个最终标签。这看起来像这样: - TaskID Label - Task1 L1 - Task1 L2 - Task1 L5 - Task2 L2 - Task2 L2 - Task2 L4 - Task3 L1

我有一个包含标签列和任务ID列的数据集。每个任务ID有3行,每个任务ID的标签列中都有一些L1-L5值。我需要根据任务中这些标签的特定组合,为每个任务分配一个最终标签。这看起来像这样:

- TaskID Label
- Task1     L1      
- Task1     L2      
- Task1     L5      
- Task2     L2      
- Task2     L2      
- Task2     L4      
- Task3     L1 
- Task3     L1 
- Task3     L1 
- TaskID   Label  Count
- Task1     L1      1
- Task1     L2      1
- Task1     L5      1
- Task2     L2      2
- Task2     L4      1
- Task3     L1      3
我对python非常陌生,并且一直在研究如何编写代码——到目前为止,我已经创建了一个新表,该表按任务ID和标签分组,并带有一个计数列,使用
lCounts=df.groupby(['task_ID','label']).agg(['count'])
看起来是这样的:

- TaskID Label
- Task1     L1      
- Task1     L2      
- Task1     L5      
- Task2     L2      
- Task2     L2      
- Task2     L4      
- Task3     L1 
- Task3     L1 
- Task3     L1 
- TaskID   Label  Count
- Task1     L1      1
- Task1     L2      1
- Task1     L5      1
- Task2     L2      2
- Task2     L4      1
- Task3     L1      3
等等,但不确定这是否有帮助。最后,我需要名为
finalLabel
的变量,该变量取决于每个任务的每个标签的计数(例如,如果一个任务有2个L2和1个L4,则最终标签为a,如果有3个L3,则最终标签为B,如果有1个L1、1个L2和1个L3,则最终标签为C,等等)。我在excel中有一个图表,将每个标签组合映射到最终标签

输出将类似于

- TaskID   FinalLabel 
- Task1     A        
- Task2     B      
- Task3     C      

我怎样才能做到最好?我被卡住了

步骤1:从excel工作表中创建字典,列表为键,标签为值

 d = {('L1', 'L3', 'L4'): A, ('L2', 'L2','L3'): B}
步骤2:为task:finallabel创建映射器

df_grouped = df.groupby('TaskID')['Label'].apply(tuple).to_frame()
步骤3:将最终列表映射到每个任务,然后映射到dict

df_grouped['FinalLabel'] = df_grouped['Label'].map(d)
希望这有帮助

编辑: 您可以根据示例中的元素计数编写赋值函数


def分配_标签(标签):
如果len(label)=len(set(label)):#标签中的3个不同元素
返回“A”
elif len(标签)-len(集合(标签))==1:#标签中的2个不同元素
返回“B”
其他:
返回“C”#标签中的所有相同元素

步骤1:从excel工作表创建字典,列表为键,标签为值

 d = {('L1', 'L3', 'L4'): A, ('L2', 'L2','L3'): B}
步骤2:为task:finallabel创建映射器

df_grouped = df.groupby('TaskID')['Label'].apply(tuple).to_frame()
步骤3:将最终列表映射到每个任务,然后映射到dict

df_grouped['FinalLabel'] = df_grouped['Label'].map(d)
希望这有帮助

编辑: 您可以根据示例中的元素计数编写赋值函数


def分配_标签(标签):
如果len(label)=len(set(label)):#标签中的3个不同元素
返回“A”
elif len(标签)-len(集合(标签))==1:#标签中的2个不同元素
返回“B”
其他:
返回“C”#标签中的所有相同元素

嘿,Vee,欢迎来到SO,感谢您发布一些示例代码和您尝试的输出示例。为了使这一点具有可复制性,我们需要一个具有预期输出的原始数据样本。我没有包括上述内容吗?我会尽量让它更清楚…嘿,Vee,欢迎来到SO,感谢您发布一些示例代码和您尝试的输出示例。为了使这一点具有可复制性,我们需要一个具有预期输出的原始数据样本。我没有包括上述内容吗?我会尽量说清楚的…谢谢!这里的“Lbl”是什么?另外,我是否需要这本字典来定义每个标签的不同顺序?像L1,L2,L3应该与L2,L1,L3相同,但是我需要分别定义每个组合吗?这就是为什么我希望用count做这件事。我试过了,但在尝试用一个列表作为键时出错。我修复了键错误。元组是不可变的,因此应该可以工作。您说过您有一个excel,可以将每个标签映射到一个组合。如果将其保存为tsv文件,则可以在python中导入并转换为字典。我不明白您如何定义最终标签。发布带有映射的最终标签或excel片段的列表。然后我们可以看到如何在python中以简单的方式生成它。在谷歌搜索了一些东西之后,我用元组尝试了它,但它也不起作用。最终标签只是基于任务中存在的3个标签的组合(顺序不重要)。每个可能的组合都会产生一个特定的标签。谢谢!这里的“Lbl”是什么?另外,我是否需要这本字典来定义每个标签的不同顺序?像L1,L2,L3应该与L2,L1,L3相同,但是我需要分别定义每个组合吗?这就是为什么我希望用count做这件事。我试过了,但在尝试用一个列表作为键时出错。我修复了键错误。元组是不可变的,因此应该可以工作。您说过您有一个excel,可以将每个标签映射到一个组合。如果将其保存为tsv文件,则可以在python中导入并转换为字典。我不明白您如何定义最终标签。发布带有映射的最终标签或excel片段的列表。然后我们可以看到如何在python中以简单的方式生成它。在谷歌搜索了一些东西之后,我用元组尝试了它,但它也不起作用。最终标签只是基于任务中存在的3个标签的组合(顺序不重要)。每个可能的组合都会产生一个特定的标签。