給出以下示例:example = pd.DataFrame({'y':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,0,-1,-1,-1]})我想按頻率計數按降序重新標記這些值。因此,我希望將案例數最多的值(例如 1)替換為 0,然后將下一個最大的 bin 替換為 1,依此類推所有值。需要注意的是我想忽略值為 -1 的情況。如果我運行value_counts(),我可以看到這個:y 1 10 2 4-1 3 0 2dtype: int64但我想要一個 pythonic 和非 hacky/clean 解決方案來創建以下內容: y0 01 02 03 04 05 06 07 08 09 010 111 112 113 114 215 216 -117 -118 -1y 0 10 1 4-1 3 2 2dtype: int64(理想情況下,我也保留舊的專欄,以便保存良好的記錄)。我可以循環每個值,檢查它是否不是 -1,然后value_counts()用迭代次數替換它,但這感覺維護成本很高。有沒有一種干凈的方法來實現它?
1 回答

米脂
TA貢獻1836條經驗 獲得超3個贊
由after?withoutSeries.map
的索引創建的字典使用:Series
Series.value_counts
-1
s = example['y'].value_counts().drop(-1)
d = {v:k for k, v in dict(enumerate(s.index)).items()}
或者:
s = example['y'].value_counts().drop(-1)
d = dict(zip(s.index, range(len(s))))
m = example['y'].ne(-1)
example.loc[m, 'y'] = example.loc[m, 'y'].map(d)
print (example)
? y
0? ?0
1? ?0
2? ?0
3? ?0
4? ?0
5? ?0
6? ?0
7? ?0
8? ?0
9? ?0
10? 1
11? 1
12? 1
13? 1
14? 2
15? 2
16 -1
17 -1
18 -1
另一個想法是增加-1價值:-1dictionary
s = example['y'].value_counts().drop(-1)
d = {**{-1:-1}, **dict(zip(s.index, range(len(s))))}
example['y'] = example['y'].map(d)
添加回答
舉報
0/150
提交
取消