使用pandas

时间:2017-10-21 09:34:45

标签: 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:&#39;系列&#39;对象是可变的,因此它们不能被散列

我甚至尝试过

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

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

如果您想要第一个 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)