如何映射值并将许多值分配给“其他”类别?

时间:2019-09-10 06:53:44

标签: python pandas

我有以下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)

2 个答案:

答案 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

在您希望仅包含col2col3的情况下,因此可以按以下方式放置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