我有一个如下示例数据框
df = pd.DataFrame(columns=['Id_hour', 'Id', 'hour', 'label'])df['Id_hour'] = ['A_1','A_2','A_3','A_4','B_1','B_2','B_3','B_4','C_1','C_2','C_3','C_4']df['Id'] = ['A','A', 'A', 'A', 'B', 'B', 'B', 'B','C', 'C', 'C', 'C']df['hour'] = ['1','2', '3', '4', '1', '2', '3','4','1', '2', '3','4']df['label'] = ['H','L', 'L', 'L', 'H', 'H', 'H', 'L','H', 'H', 'L', 'L']
我想获取每个Id中标签列出现次数的最大值。然后将出现次数最多的那个标签分配给该特定Id的所有行,分配到一个名为assigned_label的新列中。如果没有单一的局部最大值(例如,如果一个标签在每个Id中出现的次数相同),我想为该Id的所有行分配一个新的标签’R’到assigned_label列中。输出结果应该如下所示
df['assigned_label'] = ['L', 'L', 'L', 'L', 'H', 'H', 'H','H','R','R', 'R', 'R']
回答:
你可以尝试这样做:
df['assigned_label'] = df.groupby('Id')['label']\ .transform(lambda x: x.mode()[0] if len(x.mode()) == 1 else 'R')
输出结果:
Id_hour Id hour label assigned_label0 A_1 A 1 H L1 A_2 A 2 L L2 A_3 A 3 L L3 A_4 A 4 L L4 B_1 B 1 H H5 B_2 B 2 H H6 B_3 B 3 H H7 B_4 B 4 L H8 C_1 C 1 H R9 C_2 C 2 H R10 C_3 C 3 L R11 C_4 C 4 L R