我有以下DataFrame df
:
col1 col2
3 A
3 B
5 A
1 C
6 B
如何将3替换为0,将5替换为1,而其余数字应替换为2?
预期结果:
col3 col2
0 A
0 B
1 A
2 C
2 B
这是我到目前为止写的:
vals = {3:0, 5:1}
df["col3"] = df["col1"].map(vals)
答案 0 :(得分:2)
由于map
返回不匹配值的缺失值,请添加Series.fillna
:
vals = {3:0, 5:1}
df["col3"] = df["col1"].map(vals).fillna(2).astype(int)
print (df)
col1 col2 col3
0 3 A 0
1 3 B 0
2 5 A 1
3 1 C 2
4 6 B 2
答案 1 :(得分:1)
您已经接近需要的位置,只需使用df.assign
创建一个新列,并将nan
的值替换为DataFrame.replace
,然后再转换为int。
>>> df.assign(col3=df["col1"].map(vals).replace(np.nan, 2).astype(int))
col1 col2 col3
0 3 A 0
1 3 B 0
2 5 A 1
3 1 C 2
4 6 B 2
在您希望仅包含col2
和col3
的情况下,因此可以按以下方式放置col1
。
>>> df.assign(col3=df["col1"].map(vals).replace(np.nan, 2).astype(int)).drop(columns={'col1'})
# df = df.assign(col3=df["col1"].map(vals).replace(np.nan, 2).astype(int)).drop(columns={'col1'})
col2 col3
0 A 0
1 B 0
2 A 1
3 C 2
4 B 2