我正在尝试替换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
如果我可以添加更多信息,请与我们联系。
答案 0 :(得分:3)
最简单的解决方案是将列添加到string
- 然后可以使用str.upper
或str.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.mask
与str.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_first
或fillna
替换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