pandas 根据具有列值的行数拆分 Dataframe

zaq34kh6  于 2022-12-28  发布在  其他
关注(0)|答案(4)|浏览(182)

我有一个dataframe,其中有一个animals列,列中有不同的动物(比如["cat"、"dog"、"lion"]),每种动物对应一个值。有10种不同的动物,每种动物有50个条目。动物没有任何特定的顺序。
我想把 Dataframe 分成两个,一个包含每种动物的40个,另一个包含每种动物的10个。也就是说,一个 Dataframe 应该包含40只猫,40只狗等,另一个 Dataframe 应该包含10只猫,10只狗等。
任何帮助都将不胜感激。
我试过用独特的值来排序,但是没有成功。我对Pandas还不是很熟悉,这是我第一次使用它。
编辑:
添加一个更好的示例来说明我需要什么
| 动物|价值|
| - ------| - ------|
| 制动爪|十二|
| 猫|十四|
| 制动爪|十个|
| 猫|四十|
| 制动爪|九十|
| 制动爪|八十|
| 猫|三十|
| 制动爪|二十个|
| 猫|二十个|
| 猫|二十三|
我想把它分成2个 Dataframe ,在这个例子中,第一个 Dataframe 中每种动物有3个,另一个 Dataframe 中每种动物有2个。
| 动物|价值|
| - ------| - ------|
| 制动爪|十二|
| 制动爪|十个|
| 制动爪|九十|
| 猫|十四|
| 猫|四十|
| 猫|三十|
| 动物|价值|
| - ------| - ------|
| 制动爪|八十|
| 制动爪|二十个|
| 猫|二十个|
| 猫|二十三|

vbkedwbf

vbkedwbf1#

df.groupby('animal', group_keys=False).apply(lambda x: x.sample(frac=0.2))然后您可以从原始 Dataframe 中删除这些行,以创建每种动物40个的 Dataframe 。

iqjalb3h

iqjalb3h2#

您可以通过以下方式获得两个 Dataframe :

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)
z2acfund

z2acfund3#

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

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)

产生的两个数据框将打印到控制台。在本例中,第一个数据框(df1)中的每只动物将有4个条目,第二个数据框(df2)中的每只动物的最后10个条目(本例中每只动物1个条目)。

3z6pesqy

3z6pesqy4#

Pandas是真正强大的,你可以看到从@jmendes16提案.
你不知道,应该考虑的是,如果你想要40个任意挑选的值或第一个/最后一个等,此外是最后的顺序很重要。
如果你想熟悉Pandas,你可以试着一步一步地做,选择其中的一部分,然后把它们组合起来。例如,如果你想得到首批40只狗,你可以这样做:

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

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

相关问题