在 Pandas 中获取集群样本

Getting Samples of Clusters in Pandas

我在 pandas 数据框中有一个数据集,其中包含名称列表和它们所属的集群。总共有超过 1,000 个不同的集群。我希望创建 4 个样本,其中包含 100 个簇,它们之间没有簇重叠。另请记住,每个集群中的名称数量可能不同,并且集群值不是连续的。下面是数据集外观的示例。感谢任何帮助。谢谢!

姓名 集群
迈克乔丹 1
迈克尔·乔丹 1
乔·史密斯 3
约翰·S. 6
约翰·史密斯 6

使用 np.random.choicereplace=False 到 select 400 个不重叠的唯一集群,然后您可以 array_split 从中创建 100 个组。有很多方法可以拆分数据,但这里我将根据集群以及它属于 array_split 中的哪个数组将唯一 ID 映射回原始 DataFrame。

示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': list('ABCDEFGHIJ'),
                   'cluster': [1,2,3,1,2,5,5,6,6,7]})

代码

np.random.seed(1234)
N = 4
nsplits = 2

clusts = np.random.choice(df.cluster.unique(), size=N, replace=False)
d = {c: i for i, arr in enumerate(np.array_split(clusts, nsplits)) for c in arr}
#{3: 0, 2: 0, 7: 1, 1: 1}

df['group'] = df['cluster'].map(d).astype('Int64')
#  name  cluster  group
#0    A        1      1
#1    B        2      0
#2    C        3      0
#3    D        1      1
#4    E        2      0
#5    F        5   <NA>
#6    G        5   <NA>
#7    H        6   <NA>
#8    I        6   <NA>
#9    J        7      1

因此,簇 2 和 3 映射到组 1,簇 1 和 7 映射到组 2。在您的代码中,您可以使用 N = 400nsplits = 4 来获得 4 组 100。现在您可以 df.groupby('group') 获取我们映射回的每个组的数据帧。