【问题标题】:How to replace different categorical variables with another list of categorical variables如何用另一个分类变量列表替换不同的分类变量
【发布时间】:2019-09-14 03:51:15
【问题描述】:

我有一列的分类值为 [0 1 2 3 4 5]。我想用以下方式仅用 [1 2 3 4] 替换这些值:

1 -> 1
2 -> 2
3 -> 3
0,4,5 -> 3

excel分类图

我试过这段代码:

bins = [0, 1, 2, 3, 4, np.inf]
names = ['4','1','2','3','4']
data['NEW_EDU'] = pd.cut(data['EDU'], bins, labels=names)

但我得到- ValueError:分类类别必须是唯一的

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您只需要使用isin()

    df.loc[df['EDU'].isin([0,4,5])] = 3
    

    例子:

    df = pd.DataFrame({
        'EDU': [1,2,3,4,5,0,4,2]
    })
    

    输出:

        EDU
    0   1
    1   2
    2   3
    3   4
    4   5
    5   0
    6   4
    7   2
    

    使用

    df.loc[df['EDU'].isin([0,4,5])] = 3
    

    输出:

    EDU
    0   1
    1   2
    2   3
    3   3
    4   3
    5   3
    6   3
    7   2
    

    【讨论】:

      【解决方案2】:

      另一种使用 lambda 表达式的方法:

      df['NEW_EDU'] = df['EDU'].apply(lambda x: 3 if x in [0, 4, 5] else x)
      

      或者使用 numpy.where:

      import numpy as np
      df['NEW_EDU'] = np.where(df["EDU"].isin([0, 4, 5]), 3, df["EDU"])
      

      如果像@rafaelc 建议的那样,将列保持为分类类型很重要:

      df['NEW_EDU'] = pd.Categorical(np.where(df["EDU"].isin([0, 4, 5]), 3, df["EDU"]))
      

      【讨论】:

      • 这也会将 dtype 从 category 更改为 int,而不是有意的。另外,如果您手头有矢量化选项,为什么还要使用apply? ;)
      • 是的,它很慢,但它是一种选择! Numpy.where 是另一个更快的选择。
      • 老实说,apply 方法很糟糕。它很慢且不可读,更不用说您必须在该 lambda 中创建一个 lambda 函数 ,您可以在列表中“搜索”(至少可以使用 3 if x in {0,4,5} else xset 上搜索。但是np.where 选项很漂亮,可读且非常高效,因此恭喜你!:)
      【解决方案3】:

      使用字典将新值映射到键:

      value_dict = {1:1, 2:2, 3:3, 0:4, 4:4, 5:4}
      

      然后遍历列并用映射的值替换键。

      df['NEW_EDU'] = [value_dict[x] for x in df['EDU']]
      

      这使您可以在值列表之间创建任意映射

      【讨论】:

      • 这也会将 dtype 从 category 更改为 int,不是有意的
      • 只能使用地图:df['NEW_EDU'] = df['EDU'].map(value_dict)
      • @rafaelc 什么是“类别”dtype?它是intstr
      • @AdarshChavakula 看看df.dtypes 之前和之后:)
      • 也可以参考更多信息here
      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多