我有一個資料框,想要獲取值列的 idxmin,但對于每個 ID(可能出現多次)。我的df:
data = pd.DataFrame({'ID': [123, 122,122,122,123,125,126],
'values':[ 2, 1, 2, 8, 6, 4, 5]})
不,我會使用 lambda 函式,過濾 df 以獲取所有 ID 出現的子選擇 df,并使用 idxmin 獲取該子選擇的最小索引值。當我單獨使用不同的部分時,它們會按預期作業,但是當我一起使用時,它只會為每一行輸出相同的 ID(整體 idxmin)。
data.assign(TEST = lambda x: data.loc[data["ID"]==x["ID"],"values"].idxmin())
輸出:
| 指數 | ID | 價值觀 | 測驗 |
|---|---|---|---|
| 0 | 123 | 2 | 1 |
| 1 | 122 | 1 | 1 |
| 2 | 122 | 2 | 1 |
| 3 | 122 | 8 | 1 |
| 4 | 123 | 6 | 1 |
| 5 | 125 | 4 | 1 |
| 6 | 126 | 5 | 1 |
有誰知道為什么這種行為是這樣的,而不是:
| 指數 | ID | 價值觀 | 測驗 |
|---|---|---|---|
| 0 | 123 | 2 | 0 |
| 1 | 122 | 1 | 1 |
| 2 | 122 | 2 | 1 |
| 3 | 122 | 8 | 1 |
| 4 | 123 | 6 | 0 |
| 5 | 125 | 4 | 5 |
| 6 | 126 | 5 | 6 |
謝謝!
uj5u.com熱心網友回復:
在您的assign,x是完整的資料框,因此
data.loc[data["ID"]==data["ID"],"values"].idxmin()
回傳1,您的代碼相當于:
data.assign(TEST=1)
你需要在groupby這里使用:
data['TEST'] = data.groupby('ID')['values'].transform('idxmin')
輸出:
ID values TEST
0 123 2 0
1 122 1 1
2 122 2 1
3 122 8 1
4 123 6 0
5 125 4 5
6 126 5 6
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461338.html
下一篇:如何按條件將代碼應用于資料幀?
