我正在将一个数据帧分为两个;一个获取一段时间内的平均值,另一个使用该平均值。数据框类似于以下内容:
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))
之后,我当然会使用than索引从原始数据中获取第二个分割的数据帧。
都没有达到我要求的方式。
对于输出,它应该是两个数据帧,不应共享任何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
答案 0 :(得分:1)
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的类型数量!