str.replace 函数创建 NaN 数据

Sco*_*vis 8 pandas

我正在尝试替换 Pandas 列中的某些字符串,但正在替换某些NaN行。该列是一种对象数据类型。

我希望'n'将字符串中的所有行替换为'N'和 并将字符串中的所有行's'替换为'S'. 换句话说,我试图在出现时将字符串大写。

但是,我正在获取NaN没有'n''s'在字符串中的行的值。我怎么能代替'n''s'没有得到NaN为其他值?

这是我的数据框的头部:

data_frame['column_name'].head(10)
0      1n
1      1n
2      1n
3      1n
4      2n
5      2s
6       3
7       3
8      4s
9      4s
Run Code Online (Sandbox Code Playgroud)

替换后,字符串'3'现在是NaN

data_frame['column_name'] = data_frame['column_name'].str.replace('n', 'N')
data_frame['column_name'] = data_frame['column_name'].str.replace('s', 'S')

data_frame['column_name'].head(10)
Out[87]: 
0     1N
1     1N
2     1N
3     1N
4     2N
5     2S
6    NaN
7    NaN
8     4S
9     4S
Name: NCU, dtype: object
Run Code Online (Sandbox Code Playgroud)

如果我可以添加更多信息,请告诉我。

jez*_*ael 5

最简单的解决方案是将列转换为string- 然后可以使用str.upperstr.replace

data_frame['column_name'] = data_frame['column_name'].astype(str)
data_frame['column_name'] = data_frame['column_name'].str.replace('n', 'N')
data_frame['column_name'] = data_frame['column_name'].str.replace('s', 'S')
print (data_frame)
  column_name
0          1N
1          1N
2          1N
3          1N
4          2N
5          2S
6           3
7           3
8          4S
9          4S
Run Code Online (Sandbox Code Playgroud)

但是如果需要数字和字符串一起

我认为您需要Series.replace,因为您有混合值 - 带字符串的数字并str.replace返回NaN数字值的位置(bur 使用另一种解决方案mask):

data_frame['column_name'] = data_frame['column_name'].replace(['n', 's'],
                                                              ['S','N'],
                                                              regex=True)
print (data_frame)
  column_name
0          1S
1          1S
2          1S
3          1S
4          2S
5          2N
6           3
7           3
8          4N
9          4N
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是仅过滤器stringSeries.maskstr.upper以下一起使用:

mask = data_frame['column_name'].apply(type) == str
data_frame['column_name'] = data_frame['column_name'].mask(mask,
                            data_frame['column_name'].str.upper())
print (data_frame)
  column_name
0          1N
1          1N
2          1N
3          1N
4          2N
5          2S
6           3
7           3
8          4S
9          4S
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是替换NaNcombine_firstor fillna

upper = data_frame['column_name'].str.upper()
data_frame['column_name'] = upper.combine_first(data_frame['column_name'])
#alternative solution
#data_frame['column_name'] = upper.fillna(data_frame['column_name'])
  column_name
0          1N
1          1N
2          1N
3          1N
4          2N
5          2S
6           3
7           3
8          4S
9          4S
Run Code Online (Sandbox Code Playgroud)