語境
我有一個資料框,我需要將一列重新映射到不同的值。對于某些映射不明確的值,每次遇到要映射的值時,應從串列中隨機選擇結果值。
例如,列中的值應按以下方式重新映射:
- 1 ? 'a'
- 2 ? 'b' 或 'c',隨機選擇
- 3 ? 'd'
如果有兩行帶有 a 2,則每次都應進行隨機抽取以確定該值是否應映射到b或c。
示例資料
以下是一些示例資料:
import pandas as pd
df = pd.DataFrame({"col1": [1, 2, 3, 4, 5, 6, 7, 8], "col2": [2, 2, 2, 3, 1, 2, 2, 1]})
我研究過的
我已經嘗試使用映射字典map并random.choice呼叫(如本答案中所述):
choice_list = ["b", "c"]
map_dict = {1: "a", 2: random.choice(choice_list), 3: "d"}
df["remap"] = df.col2.map(map_dict)
我發現在重新映射 value 時2,總是從choice_list所有行中選擇一個值,例如 all b:
col1 col2 remap
0 1 2 b
1 2 2 b
2 3 2 b
3 4 3 d
4 5 1 a
5 6 2 b
6 7 2 b
7 8 1 a
當我使用該replace方法時會發生類似的事情。
我的預期結果是這樣的:
col1 col2 remap
0 1 2 b
1 2 2 c
2 3 2 b
3 4 3 d
4 5 1 a
5 6 2 b
6 7 2 c
7 8 1 a
uj5u.com熱心網友回復:
怎么了
通過執行以下操作,您可以一勞永逸地選擇您不想要的所有替換值。
map_dict = {1: "a", 2: random.choice(choice_list), 3: "d"}
如何修復它
每次繪制地圖時,您都需要做出隨機選擇。
為此,請更改map_dict格式并使用一個小包裝器:
import random
map_dict = {1: ["a"], 2: ["b", "c"], 3: ["d"]}
df["remap"] = df.col2.map(lambda x: random.choice(map_dict[x]))
可能的輸出:
col1 col2 remap
0 1 2 c
1 2 2 b
2 3 2 c
3 4 3 d
4 5 1 a
5 6 2 b
6 7 2 c
7 8 1 a
大型資料集的更快替代方案
如果你有很多行(數萬行),這個替代方法會更快:
map_dict = {1: ["a"], 2: ["b", "c"], 3: ["d"]}
map_s = pd.Series(map_dict, name='remap').explode()
(df.merge(map_s, left_on='col2', right_index=True)
.groupby(level=0).sample(1)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315275.html
下一篇:以有序的方式洗牌
