python - 使用 Pandas 从groupby中挑选随机元素

标签 python pandas dataframe group-by pandas-groupby

我有这样的数据框:

    revisionId  itemId wikidataType
1    307190482      23           Q5
6    305019084      80           Q5
8    303692414     181           Q5
9    306600439     192           Q5
11   294597048     206           Q5

在完整的数据框中,wikidataType 列中有 100 个这样的不同值。它是一个大数据框,所以我想将它限制为每个 wikidataType 1000 条记录。因此,我使用了以下内容:

df = df[df.groupby('wikidataType')['wikidataType'].cumcount() < 1000]

这为每个 wikidataType 提供了前 1000 条记录。我想随机选择这1000条记录。所以我尝试使用

df = df[random.sample(list(df.groupby('wikidataType')['wikidataType']), 1000)]

但是报错如下:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

我试过了

 df = df[df.groupby('wikidataType')['wikidataType'].cumcount().random() < 1000]

但这也没有用。任何人都知道我该怎么做?

提前致谢。

最佳答案

如果您想要 1000 个元素,我推荐的一种更简单的方法是使用groupby + head:

df = df.groupby('wikidataType').head(1000)

如果你想要 1000 个随机元素,调用sample:

df = df.groupby('wikidataType', group_keys=False)\
                           .apply(lambda x: x.sample(1000))

您可以选择指定分数:

df = df.groupby('wikidataType', group_keys=False)\
                           .apply(lambda x: x.sample(frac=len(x) * .1)) 

它为您提供每种元素类型的 10%。如果您的人口规模不同,或者如果您在任何组中的元素少于 1000 个,这将有所帮助。


根据您的意见,对该方法稍作修改:

df = df.groupby('wikidataType', group_keys=False)\
               .apply(lambda x: x.sample(1000) if len(x) > 1000 else x) 

关于python - 使用 Pandas 从groupby中挑选随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861899/

相关文章:

python - 如何对数据框中的列进行分组,其中包含包含元组列表的列

python - Django:DecimalField 值显示

python - reshape 数据帧以与另一个数据帧具有相同的索引

python - 用Python的statsmodels的OLS线性回归进行曲线拟合时,公式中的常数如何选择?

用相邻行 "ROW"而非列中的值替换行中的 NA

python - 如何迭代一行并相互比较?

python - 在 Pandas 数据框中的两个日期时间列中获得差异

python - 为什么 numpy.argsort() 会改组关系的索引?

python - 在 Dynamic_RNN 中使用可变序列长度时我应该做损失掩蔽吗

python - 如何使用python csv reader查看A列中的行是否存在于B列中