pandas将一列替换为多个值

Art*_*ijk 17 python replace pandas

在列冒险级别中,我想将Small替换为1,将Medium替换为5,将High替换为15.我尝试:

dfm.replace({'risk':{'Small': '1'}},{'risk':{'Medium': '5'}},{'risk':{'High': '15'}})
Run Code Online (Sandbox Code Playgroud)

但只有媒体被取代了.怎么了 ?

Jef*_*eff 39

您的替换格式已关闭

In [21]: df = pd.DataFrame({'a':['Small', 'Medium', 'High']})

In [22]: df
Out[22]: 
        a
0   Small
1  Medium
2    High

[3 rows x 1 columns]

In [23]: df.replace({'a' : { 'Medium' : 2, 'Small' : 1, 'High' : 3 }})
Out[23]: 
   a
0  1
1  2
2  3

[3 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)

  • 我不确定`replace`格式行出了什么问题,所以我建议改用`map`。+1用于发现OP错误 (2认同)

Sur*_*rya 8

In [123]: import pandas as pd                                                                                                                                

In [124]: state_df = pd.DataFrame({'state':['Small', 'Medium', 'High', 'Small', 'High']})                                                                    

In [125]: state_df
Out[125]: 
    state
0   Small
1  Medium
2    High
3   Small
4    High

In [126]: replace_values = {'Small' : 1, 'Medium' : 2, 'High' : 3 }                                                                                          

In [127]: state_df = state_df.replace({"state": replace_values})                                                                                             

In [128]: state_df
Out[128]: 
   state
0      1
1      2
2      3
3      1
4      3
Run Code Online (Sandbox Code Playgroud)


EdC*_*ica 7

你可以定义一个字典和电话 map

In [256]:

df = pd.DataFrame({'a':['Small', 'Medium', 'High']})
df
Out[256]:
        a
0   Small
1  Medium
2    High

[3 rows x 1 columns]
In [258]:

vals_to_replace = {'Small':'1', 'Medium':'5', 'High':'15'}
df['a'] = df['a'].map(vals_to_replace)
df
Out[258]:
    a
0   1
1   5
2  15

[3 rows x 1 columns]


In [279]:

val1 = [1,5,15]
df['risk'].update(pd.Series(val1))
df
Out[279]:
  risk
0    1
1    5
2   15

[3 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)


Chr*_*ger 6

看起来 OP 可能一直在寻找一种单线来通过连续调用来解决这个问题.str.replace

dfm.column = dfm.column.str.replace('Small', '1') \
    .str.replace('Medium', '5') \
        .str.replace('High', '15')
Run Code Online (Sandbox Code Playgroud)

OP,您很接近,但只需要将逗号替换为 ,.str.replace并且不需要字典格式的列调用(“风险”)。只需将匹配模式和替换值作为要替换的参数传递即可。

  • 欢迎使用堆栈溢出。请你能在你的答案中添加一些解释吗?(你做了什么改变,为什么?为什么 OP 的原始代码不起作用?)如果没有解释,答案对未来的访问者就没那么有用了。 (6认同)
  • 这个答案补充了什么,而其他答案缺乏? (2认同)

小智 6

我必须打开“regex”标志才能使其工作:

 df.replace({'a' : {'Medium':2, 'Small':1, 'High':3 }}, regex=True)
Run Code Online (Sandbox Code Playgroud)