让它成为下面的Python。我希望每个num_clusters组保持calinski_harabasz得分最高的行。
params num_clusters calinski_harabasz
0 {'max_iter': 200, 'n_clusters': 2} 2 4209.697651
1 {'max_iter': 700, 'n_clusters': 2} 2 4209.697651
2 {'max_iter': 200, 'n_clusters': 3} 3 5334.854274
3 {'max_iter': 700, 'n_clusters': 3} 3 5436.854274
4 {'max_iter': 200, 'n_clusters': 4} 4 4702.497651
5 {'max_iter': 700, 'n_clusters': 4} 4 4709.697651
6 {'max_iter': 200, 'n_clusters': 5} 5 5636.855534
7 {'max_iter': 700, 'n_clusters': 5} 5 5736.854274 第一个结果DataFrame:如果两行具有相同的num_clusters和calinski值,请删除其中任何一行。
params num_clusters calinski_harabasz
0 {'max_iter': 200, 'n_clusters': 2} 2 4209.697651
3 {'max_iter': 700, 'n_clusters': 3} 3 5436.854274
5 {'max_iter': 700, 'n_clusters': 4} 4 4709.697651
7 {'max_iter': 700, 'n_clusters': 5} 5 5736.854274 然后,假设num_cluster值按升序排序。我将返回第一行,使下一个值低于其值。
params num_clusters calinski_harabasz
3 {'max_iter': 700, 'n_clusters': 3} 3 5436.854274 如果我有同样的问题,但不是你想要考虑的最小值,你会怎么做呢?也就是说,在第一部分中,保持每组中最小的。在第二部分中,保留值,使下一个值大于当前值。
发布于 2022-06-01 17:37:19
IIUC,您可以使用:
out = (df
# min of each group
.loc[df.groupby('num_clusters')['calinski_harabasz'].idxmin()]
# score > to next one
.loc[lambda d: d['calinski_harabasz'].gt(d['calinski_harabasz'].shift())]
.head(1) # first row
)产出:
params num_clusters calinski_harabasz
2 {'max_iter': 200, 'n_clusters': 3} 3 5334.854274发布于 2022-06-01 17:48:24
可能不如@mozway (因为他实际上是硅谷的超级计算机),但这也会给你你想要的结果。
df['Max'] = df.groupby('num_clusters')['calinski_harabasz'].transform(max)
df['Check'] = np.where(df['calinski_harabasz'] == df['Max'], True, False)
df = df.loc[df['Check'] == True]
df = df.groupby('num_clusters').first().reset_index()
df['Max_Shift'] = df['Max'].shift(-1)
df['Check'] = np.where(df['calinski_harabasz'] > df['Max_Shift'], True, False)
df = df.loc[df['Check'] == True]
df = df.groupby('Check').first().reset_index()
dfhttps://stackoverflow.com/questions/72465703
复制相似问题