python - 有没有办法对“类型”列进行采样,同时将该类型中的所有 ID 保留在另一列中?
问题描述
我将数据框分成两部分;一个是获取一段时间内的平均值,另一个是使用该平均值。数据框类似于以下内容:
ID Type Num. Hours Month
2 black 10 Jan
2 black 12 Feb
2 black 15 March
3 red 7 Jan
3 red 10 Feb
每个 ID 有 24 行,跨越 2 年。不同的 ID 可以具有相同的类型或不同的类型。我希望两个拆分数据帧具有相同数量的不同类型,同时为每个唯一 ID 保留所有 24 个 ID。
我试过按类型和 ID 分组,一起和分开,但它似乎只给了我一小部分 ID,而不是把它们放在一起
df1 = df.groupby('ID')['Type'].apply(lambda x: x.sample(frac=0.5))
或者
df1 = df.groupby(['ID', 'Type']).apply(lambda x: x.sample(frac=0.5))
然后当然我会使用比索引从原始数据帧中获取第二个拆分数据帧。
两者都没有按照我的要求工作。
对于输出,它应该是两个数据帧,它们不应该共享任何 ID,并且具有相同数量的不同类型。
因此,使用与上述类似的东西,我希望输出一个如下所示的 DataFrame:
ID Type Num. Hours Month
2 black 10 Jan
2 black 12 Feb
2 black 15 March
5 yellow 17 Jan
5 yellow 21 Feb
使用该表可以让我在原始数据帧上建立索引并给我第二个表,该表输出类似于以下内容:
ID Type Num. Hours Month
4 black 10 Jan
4 black 12 Feb
4 black 15 March
6 yellow 22 Jan
6 yellow 27 Feb
解决方案
sample 取一小部分,但不会将数据帧一分为二。得到了一半的样本,取另一半就简单了!
我假设您的原始行按照您希望它适用于第一个数据帧的方式工作
df1 = df.groupby(['ID', 'Type']).apply(lambda x: x.sample(frac=0.5))
df2 = df[~df.index.isin(df1.index)]
更新
基于评论;随机划分你ID
的两个数据帧,你可以使用以下内容:
import random
unique_ids = df.ID.unique()
random.shuffle(unique_ids)
id_set_1 = unique_ids[: len(unique_ids) // 2] # take first half of list
df1 = df[df.ID.isin(id_set_1)]
df2 = df[~df.ID.isin(id_set_2)]
请注意,这可能会导致两个数据帧的大小非常不同,具体取决于每个 ID 的类型数量!
推荐阅读
- php-7.1 - 如何“警告:htmlspecialchars() 期望参数 1 是字符串,
- android - 如何在不使用 Firebase 身份验证的情况下编写 Firestore 数据库安全规则
- spring-boot - 找不到从命令行运行 spring-boot 的 Libreoffice jar
- java - 如何使用 Selenium Hub、Node 和 Remote Webdriver 捕获图像并将它们附加到 Cucumber Reports (Jenkins)?
- c# - 如何使用 linq 增加辅助 ID(不是主键)?
- c# - 为什么 OnCollisionEnter 没有被触发?
- c# - BitLocker 值
- azure - 如何在 Azure ML Studio 和服务中使用自定义算法?
- python - 如何在格式为“0000-00-00T00:00:00+00:00”的字符串上使用 datetime.strptime?
- java - 如何解决 org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attach to the page document