Python 从pandas数据帧中获取随机样本,但每个值只有一个

Python 从pandas数据帧中获取随机样本,但每个值只有一个,python,pandas,Python,Pandas,我的数据集是运动员数据集,其中一列是AthleteName。共有38次观察,但有些运动员不止一次参加,因此总共有31名运动员。 我想提取一个包含31个观察值的“随机”样本,其中所有的观察值只出现一次,而对于出现更多时间的观察值,则随机选取一个 我尝试过这样做,但它给了我一个错误: sample_fem = pd.DataFrame total = 0 while total <= 31: sample = female_dec.sample(n=1, replace=False)

我的数据集是运动员数据集,其中一列是
AthleteName
。共有38次观察,但有些运动员不止一次参加,因此总共有31名运动员。 我想提取一个包含31个观察值的“随机”样本,其中所有的观察值只出现一次,而对于出现更多时间的观察值,则随机选取一个

我尝试过这样做,但它给了我一个错误:

sample_fem = pd.DataFrame
total = 0
while total <= 31:
    sample = female_dec.sample(n=1, replace=False)
    sample = sample.reset_index()
    if sample["AthleteName"][0] not in sample_fem["AthleteName"]:
       sample_fem.append(sample)
       total +=1 


  File "<ipython-input-561-249bb5b47652>", line 6, in <module>
    if sample["AthleteName"][0] not in sample_fem["AthleteName"]:

TypeError: 'type' object is not subscriptable

sample\u fem=pd.DataFrame
总数=0

虽然total听起来像是你想要的“随机样本”是:

  • 运动员的所有记录在数据中只出现一次
  • 每个运动员的单个记录,在数据中出现两次或两次以上,随机选择
要做到这一点,首先我们构建一个数据帧,并指示一条记录是否多次出现

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({'a':[0,1,2,3,4,4,5,6,2]})
df['dup_flag']=df.duplicated(keep=False)
df
dup_旗
0 0错误
1 1错误
2正确
3 3错误
4正确
5.4正确
6.5错误
7.6错误
8.2正确
接下来,根据我们创建的标志变量,我们将其分为“uniques”和“dups”

uniques=df.loc[df.dup_flag==False]
dups=df.loc[df.dup_标志==True]
因此,在对
dups
数据帧使用
drop\u duplicates
之前,只需为索引定义一个随机顺序。然后,我们可以合并结果

random\u order\u idx=np.random.permutation(np.arange(len(dups)))
random\u dups\u Dupped=dups.iloc[random\u order\u idx]。删除重复项()
pd.concat([唯一性,随机重复数据消除])
dup_旗
0 0错误
1 1错误
3 3错误
6.5错误
7.6错误
5.4正确
2正确

sample\u fem=pd.DataFrame
sample\u fem
设置为
DataFrame
类型,这可能会导致错误。您不能对类型执行
sample\u fem[“AthleteName”]
。@NickBecker您是对的。将其更改为sample_fem[“DecathleteName”]。值,但它需要运行很长时间,所以我正在修补它不正确。。有什么想法吗?有可能有更好的方法来做你想做的事情,但你想做的事情还不完全清楚。如果我理解正确,一个更快的方法可能是使用
df.duplicated
创建一个标志变量来判断记录是否重复,然后随机删除“True”的重复项。我会发布一个答案