使用 pandas 从 groupby 中选取随机元素
Picking random elements from groupby using pandas
我有这样的数据框:
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]
但这也没有用。有人知道我该怎么做吗?
提前致谢。
我推荐的一种更简单的方法,如果你想要 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)
我有这样的数据框:
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]
但这也没有用。有人知道我该怎么做吗?
提前致谢。
我推荐的一种更简单的方法,如果你想要 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)