【问题标题】:Picking random elements from groupby using pandas使用 pandas 从 groupby 中选择随机元素
【发布时间】:2017-10-21 09:34:45
【问题描述】:

我有如下所示的数据框:

    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' 对象是可变的,因此它们不能被散列

我什至尝试过

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

但这也没有用。有谁知道我该怎么做?

提前致谢。

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    如果您想要 first 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) 
    

    【讨论】:

    • 我随机需要 1000 条记录。不是前 1000 个。
    • @NilakshiNaphade 是的,我正在添加它。请参阅编辑。
    • 我可能需要最后一个分数。但如果尺寸小于 1000,我想要最小 1000 或全部。
    • @NilakshiNaphade 又进行了一次编辑。随意玩弄它并调整最适合您需要的东西。
    • 对于同样的问题,我几乎不需要进一步的帮助。如果我没有 1000 条记录,那么我仍然需要 1000 条记录,但需要替换。例如。如果对于 wikidataType Q5 我有 900 条记录,那么我想从这 900 条记录中重复一些随机的 100 条记录。所以最后我将有 900 条不同的记录,其中 100 条是重复的。我使用了 x.sample(1000, replace=True) 但它只给了我 4 条 Q5 类型的不同记录,每条记录都重复了很多次,而我实际上有 1000 条该类型的不同记录。
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2014-06-19
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多