我有一個帶有日期和值的熊貓資料框。
import pandas as pd
df = pd.DataFrame({'date':['11-10','11-10','11-10','12-10','12-10','12-10'],
'id': [1, 1, 2, 1, 1, 2],
'val':[20, 30, 40, 50, 25, 35] })
我希望過濾器 DataFrame 只包含每個日期的頂部和底部 N 行。假設 N = 2。然后,資料幀將丟棄 1st row11-10 20和 5th row 12-10 25。
希望有一個解決方案可以針對不同的 值進行縮放N。
uj5u.com熱心網友回復:
您可以通過組資料幀date,然后呼叫nlargest為val列,傳遞的價值N:
>>> df.groupby('date')['val'].nlargest(2)
date
11-10 2 40
1 30
12-10 3 50
5 35
Name: val, dtype: int64
如果需要,您可以呼叫to_frame()結果系列將其轉換為資料幀。
對于更新的問題,您仍然可以通過一些額外的作業來實作上面的代碼來獲取 id,然后與原始資料幀進行內部合并:
out= (df.set_index('id')
.groupby(['date'])['val']
.nlargest(2)
.to_frame('val')
.reset_index()
.merge(df, how='inner')
)
輸出:
date id val
0 11-10 2 40
1 11-10 1 30
2 12-10 1 50
3 12-10 2 35
uj5u.com熱心網友回復:
你可以做:
index_of_N_greatest_vals = df.groupby('date')['val'].nlargest(N).reset_index()['level_1']
df1 = df[df.index.isin(index_of_N_greatest_vals)]
輸出:
date id val
1 11-10 1 30
2 11-10 2 40
3 12-10 1 50
5 12-10 2 35
uj5u.com熱心網友回復:
一種選擇是對列進行排序并在 groupby 上取尾:
(df.sort_values(['date', 'val'])
.groupby('date', sort = False)
.tail(n=2)
)
date id val
1 11-10 1 30
2 11-10 2 40
5 12-10 2 35
3 12-10 1 50
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371459.html
上一篇:在groupby之后使用第一列?
