str.replace函数创建NaN数据

时间:2017-05-08 19:29:30

标签: 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

替换后,字符串'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

如果我可以添加更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是将列添加到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

但如果需要将数字与字符串放在一起

我认为您需要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

另一种解决方案是仅过滤string并将Series.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

另一种解决方案是combine_firstfillna替换NaN

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