[英]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.