Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用另一个分类变量列表替换不同的分类变量_Python_Pandas - Fatal编程技术网

Python 如何用另一个分类变量列表替换不同的分类变量

Python 如何用另一个分类变量列表替换不同的分类变量,python,pandas,Python,Pandas,我有一个列,其分类值为[01 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] 名称=['4'、'1'、'2'、'3'、'4'] 数据['NEW_EDU']=pd.cutdata['EDU'],箱子,标签=名称 但我得到- ValueError:分类类别必须是唯一的您只需使用 例如: df = pd.Da

我有一个列,其分类值为[01 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] 名称=['4'、'1'、'2'、'3'、'4'] 数据['NEW_EDU']=pd.cutdata['EDU'],箱子,标签=名称 但我得到- ValueError:分类类别必须是唯一的

您只需使用

例如:

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
EDU
0   1
1   2
2   3
3   3
4   3
5   3
6   3
7   2
使用

输出:

    EDU
0   1
1   2
2   3
3   4
4   5
5   0
6   4
7   2
EDU
0   1
1   2
2   3
3   3
4   3
5   3
6   3
7   2
您只需要使用

例如:

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
EDU
0   1
1   2
2   3
3   3
4   3
5   3
6   3
7   2
使用

输出:

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

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

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']]

这允许您在值列表之间创建任意映射

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

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']]

这允许您使用lambda表达式在值列表之间创建任意映射:

df['NEW_EDU'] = df['EDU'].apply(lambda x: 3 if x in [0, 4, 5] else x)
或者使用numpy。其中:

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"]))

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

df['NEW_EDU'] = df['EDU'].apply(lambda x: 3 if x in [0, 4, 5] else x)
或者使用numpy。其中:

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"]))

这也会将数据类型从category更改为int,而不是intended。您可以只使用map:df['NEW_EDU']=df['EDU'].mapvalue_dict@rafaelc什么是“类别”数据类型?它可以是int或str.@AdarshChavakula查看df.dtypes前后:也可以参考更多信息这也会将dtype从category更改为int,而不是intended。可以只使用map:df['NEW_EDU']=df['EDU'].mapvalue_dict@rafaelc什么是“类别”数据类型?要么是int,要么是str。@AdarshChavakula查看df.dtypes之前和之后的情况:还可以参考更多信息这也会将dtype从category更改为int,这不是故意的。另外,如果手头有矢量化选项,为什么要使用apply;是的,速度很慢,但这是一个选择!Numpy.where是另一个更快的选择。老实说,apply方法很糟糕。它速度慢且不可读,不考虑必须创建一个lambda函数,并且在列表中搜索的lambda中至少可以使用3 if x in{0,4,5}else x来搜索集合。但是np.where选项很漂亮,可读性好,效率也很高,所以恭喜你这也会将数据类型从category更改为int,而不是预期的。另外,如果手头有矢量化选项,为什么要使用apply;是的,速度很慢,但这是一个选择!Numpy.where是另一个更快的选择。老实说,apply方法很糟糕。它速度慢且不可读,不考虑必须创建一个lambda函数,并且在列表中搜索的lambda中至少可以使用3 if x in{0,4,5}else x来搜索集合。但是np.where选项很漂亮,可读性好,效率也很高,所以恭喜你