繁体   English   中英

根据具有列值的行数拆分数据框

[英]Split dataframe based on number of rows with a column value

我有一个数据框,其中有一个动物列,其中包含不同的动物(比如 ["cat"、"dog"、"lion"])作为行和对应于每只动物的值。 有 10 种独特的动物,每种动物有 50 个条目。 这些动物没有任何特定的顺序。

我想将数据框分成两部分,一个包含每只动物 40 只,另一个包含每只动物 10 只。 也就是说,一个数据框应该包含 40 只猫、40 条狗等,而另一个数据框应该包含 10 只猫、10 条狗等。

任何帮助将不胜感激。

我试图按唯一值排序,但没有成功。 我对 Pandas 还不是很熟悉,这是我第一次使用它。

编辑:

添加一个更好的例子来说明我需要什么

动物 价值
12
14
10
40
90后
80
30
20
20
23

我想把它分成 2 个数据框。 在这个例子中,第一个数据框每只动物有 3 个,另一个数据框每只动物有 2 个。

动物 价值
12
10
90后
14
40
30
动物 价值
80
20
20
23

这行得通吗? df.groupby('animal', group_keys=False).apply(lambda x: x.sample(frac=0.2))然后,您可以从原始数据框中删除这些行,以创建每只动物 40 只的行。

您可以通过以下方式获取两个数据帧:

df_big = df.groupby('category').apply(lambda x: x.sample(frac=0.8)).reset_index('category', drop=True)
df_small = df.drop(df_big.index)

我们可以构造一个自定义函数,根据要求一个返回每个动物 40 个条目,另一个应包含 10 个条目的要求,返回两个 DataFrame,然后将该函数应用于按“动物”列分组的 DataFrame:

def split_df(df):
    df1 = df[df['value'] < 30]  # select rows where 'value' is less than 30
    df2 = df[df['value'] >= 30]  # select rows where 'value' is greater than or equal to 30
    return df1, df2

# apply the custom function to the DataFrame, grouped by 'Animal'
df1, df2 = df.groupby('Animal').apply(split_df)

print(df1)
print(df2)

产生的两个数据帧将作为结果打印到控制台。 在此示例中,第一个 DataFrame (df1) 中的每只动物将有四个条目,每个动物的最后 10 个项目将在第二个 DataFrame (df2) 中(在此示例中,每个动物有一个条目)。

从 @jmendes16 提案中可以看出,Pandas 真的很强大。

你没有提及但应该考虑的是,如果你想要 40 个任意选择的值或第一个/最后一个等。此外,最终顺序很重要。

如果你想熟悉 pandas,你可以尝试一步一步地做,通过选择它的部分并将它们组合起来。 例如。 如果你想得到前四十只狗,你可以这样做:

df_40 = df[df.Animal == "dog"].iloc[0:40]
df_10 = df[df.Animal == "dog"].iloc[40:50]

编辑:这不是一个有效的解决方案,而是一种教育解决方案;)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM