str.replace function creating NaN data
pandas
Solution
Simpliest solution is cast column to `string` - then is possible use `str.upper` or `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
But if need numeric with strings together:
I think you need `Series.replace`, because you have mixed values - numeric with strings and `str.replace` return `NaN` where numeric values (bur works another solution with `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
Another solution is filter only `string` and use `Series.mask` with `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
Another solution is replace `NaN` by `combine_first` or `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
Problem
I am trying to replace certain strings in a column in pandas, but am getting `NaN` for some rows. The column is an object datatype. I want all rows with `'n'` in the string replaced with `'N'` and and all rows with `'s'` in the string replaced with `'S'`. In other words, I am trying to capitalize the string when it appears. However, I am am getting `NaN` values for rows without `'n'` or `'s'` in the string. How can I replace `'n'` and `'s'` without getting `NaN` for the other values? Here is the head of my dataframe: ``` 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 ``` After replacing, the string `'3'` is now `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 ``` Please let me know if I can add more information.