簡體   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