替换pandas中列内的值

时间:2018-05-22 14:24:29

标签: python pandas datetime

我正在尝试更换'期间'此数据框中的列:

     Year  Period        y          yhat                Contas Resultado 
0   2017       1  1.251556e+00  1.251556e+00               Devoluções   
1   2017       2  2.109900e-01  2.109899e-01               Devoluções   
2   2017       3  1.186015e+00  1.186015e+00               Devoluções   
3   2017       4  2.530208e-01  2.530208e-01               Devoluções   
4   2017       5  2.305744e-01  2.305745e-01               Devoluções   
5   2017       6  2.367768e-01  2.367768e-01               Devoluções   
6   2017       7  2.509670e-01  2.509670e-01               Devoluções   
7   2017       8  2.525350e-01  2.525350e-01               Devoluções   
8   2017       9  2.509663e-01  2.509663e-01               Devoluções   
9   2017      10  2.204747e-01  2.204747e-01               Devoluções   
10  2017      11  2.262774e-01  2.262774e-01               Devoluções   
11  2017      12  2.373548e-01  2.373548e-01               Devoluções   
12  2018       1  1.155845e+00  1.155845e+00               Devoluções   
...

使用此命令:

repl_dict = {
    '01': 'M1', '02': 'M2', '03': 'M3', '04': 'M4', '05': 'M5', '06': 'M6',
    '07': 'M7', '08': 'M8', '09':'M9', '10':'M10', '11':'M11', '12':'M12'
}

results['Period'].replace(repl_dict)

但是我收到以下错误:

TypeError: Cannot compare types 'ndarray(dtype=int64)' and 'str'

5 个答案:

答案 0 :(得分:5)

Python 3.6+ f-strings

df.assign(Period=[f'M{i}' for i in df.Period])

    Year Period         y      yhat Contas Resultado
0   2017     M1  1.251556  1.251556       Devoluções
1   2017     M2  0.210990  0.210990       Devoluções
2   2017     M3  1.186015  1.186015       Devoluções
3   2017     M4  0.253021  0.253021       Devoluções
4   2017     M5  0.230574  0.230574       Devoluções
5   2017     M6  0.236777  0.236777       Devoluções
6   2017     M7  0.250967  0.250967       Devoluções
7   2017     M8  0.252535  0.252535       Devoluções
8   2017     M9  0.250966  0.250966       Devoluções
9   2017    M10  0.220475  0.220475       Devoluções
10  2017    M11  0.226277  0.226277       Devoluções
11  2017    M12  0.237355  0.237355       Devoluções
12  2018     M1  1.155845  1.155845       Devoluções

str.format功能

df.assign(Period=df.Period.map('M{}'.format))

    Year Period         y      yhat Contas Resultado
0   2017     M1  1.251556  1.251556       Devoluções
1   2017     M2  0.210990  0.210990       Devoluções
2   2017     M3  1.186015  1.186015       Devoluções
3   2017     M4  0.253021  0.253021       Devoluções
4   2017     M5  0.230574  0.230574       Devoluções
5   2017     M6  0.236777  0.236777       Devoluções
6   2017     M7  0.250967  0.250967       Devoluções
7   2017     M8  0.252535  0.252535       Devoluções
8   2017     M9  0.250966  0.250966       Devoluções
9   2017    M10  0.220475  0.220475       Devoluções
10  2017    M11  0.226277  0.226277       Devoluções
11  2017    M12  0.237355  0.237355       Devoluções
12  2018     M1  1.155845  1.155845       Devoluções

答案 1 :(得分:3)

一种解决方案是将整数值转换为string并添加M

results['Period'] = 'M' + results['Period'].astype(str)

map已更改dictionary - 密钥为integers

results['Period'] = results['Period'].map({x: 'M' + str(x) for x in range(1, 13)})

<强>详细

print ({x: 'M' + str(x) for x in range(1, 13)})
{1: 'M1', 2: 'M2', 3: 'M3', 4: 'M4', 5: 'M5', 6: 'M6', 
 7: 'M7', 8: 'M8', 9: 'M9', 10: 'M10', 11: 'M11', 12: 'M12'}
print (results)
    Year Period         y      yhat Contas Resultado
0   2017     M1  1.251556  1.251556       Devolucoes
1   2017     M2  0.210990  0.210990       Devolucoes
2   2017     M3  1.186015  1.186015       Devolucoes
3   2017     M4  0.253021  0.253021       Devolucoes
4   2017     M5  0.230574  0.230574       Devolucoes
5   2017     M6  0.236777  0.236777       Devolucoes
6   2017     M7  0.250967  0.250967       Devolucoes
7   2017     M8  0.252535  0.252535       Devolucoes
8   2017     M9  0.250966  0.250966       Devolucoes
9   2017    M10  0.220475  0.220475       Devolucoes
10  2017    M11  0.226277  0.226277       Devolucoes
11  2017    M12  0.237355  0.237355       Devolucoes
12  2018     M1  1.155845  1.155845       Devolucoes

答案 2 :(得分:3)

我们可以使用map

s=pd.Series(repl_dict )
s.index=s.index.astype(int)
results['Period'] = results['Period'].map(s)

答案 3 :(得分:2)

将您的系列从数字转换为字符串以匹配您的字典。

此外,我强烈建议您使用pd.Series.map,因为pd.Series.replace有相对的开销。

d = {'01': 'M1', ....}
results['Period'] = results['Period'].astype(str).str.zfill(2).map(d)

我们使用str.zfill(2)将零填充到最多2个数字。

答案 4 :(得分:0)

首先转换您的列数据类型,这就是您收到错误的原因:

results['Period'] = results['Period'].astype(str)

results['Period'].replace({'01':'M1', '02':'M2', '03':'M3', '04': 'M4', '05': 'M5', '06': 'M6', '07': 'M7', '08': 'M8', '09':'M9', '10':'M10', '11':'M11', '12':'M12'})