[英]How do I select rows from DataFrame based on some preferences on column values?
我正在嘗試通過從現有的 Df 中選擇行來創建一個新的 DataFrame。
東風:
ID val1 val2 uniq
A 10 0 1-2
A 10 0 3-2
B 10 0 8-0
B 9 1 7-6
B 8 2 9-3
c 9 1 10-3
c 9 1 3-0
根據 col val1 和 val2 上的首選項,我只希望每個 ID 有 2 行:
1) val1 == 10 & val2 == 0 (first preference)
2) val1 == 9 & val2 == 1 (second preference)
3) val1 == 8 & val2 == 2 (third preference)
所需輸出:
ID val1 val2 uniq
A 10 0 1-2
A 10 0 3-2
B 10 0 8-0
B 9 1 7-6
c 9 1 10-3
c 9 1 3-0
在熊貓中有沒有有效的方法來做到這一點? 謝謝你的時間!
df.sort_values(['val1', 'val2'], ascending=[False, True]).groupby('ID').head(2)
ID val1 val2 uniq
0 A 10 0 1-2
1 A 10 0 3-2
2 B 10 0 8-0
3 B 9 1 7-6
5 c 9 1 10-3
6 c 9 1 3-0
編輯:
如果可能存在其他類型的組合但只考慮上述三種組合,則執行以下操作:
a = (df[['val1', 'val2']].astype(str)
.apply(' '.join, axis = 1).astype('category'))
order = ['10 0', '9 1', '8 2']
levels = np.r_[order, a.cat.remove_categories(order).cat.categories]
df['a'] = a.cat.reorder_categories(levels).cat.as_ordered()
df.sort_values('a').groupby('ID').head(2).drop(columns='a')
ID val1 val2 uniq
0 A 10 0 1-2
1 A 10 0 3-2
2 B 10 0 8-0
3 B 9 1 7-6
5 c 9 1 10-3
6 c 9 1 3-0
按照你的喜好,我做到了
df = {'ID':['A', 'A', 'B', 'B', 'B', 'C', 'C'],
'val1': [10,10,10,9,8,9,9],
'val2': [0,0,0,1,2,1,1]}
df = pd.DataFrame(df)
df1 = df[(df['val1'] == 10) & (df['val2'] == 0)][:2]
df2 = df[(df['val1'] == 9) & (df['val2'] == 1)][:2]
df3 = df[(df['val1'] == 8) & (df['val2'] == 2)][:2]
df4 = df1.append(df2)
df = df4.append(df3)
df.sort_values(['ID'])
輸出
沒有偏好
df.groupby(['ID']).head(2)
輸出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.