2017-05-08 8 views
1

パンダの列の特定の文字列を置き換えようとしていますが、一部の行にはNaNがあります。列はオブジェクトデータ型です。str.replace関数NaNデータを作成する

私は'S'に置き換えた文字列で'N'として's'を持つすべての行に置き換えた文字列に'n'を持つすべての行をしたいです。言い換えれば、文字列が現れたら大文字にすることを試みています。

ただし、文字列に'n'または's'がない行の値がNaNになっています。 '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

最も単純溶液を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 

別の解決策は、フィルターのみstringstr.upperSeries.maskを使用している:

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またはfillnaNaNを置き換えるです:

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 
+0

がjezraelありがとう、私は変換しなければなりませんでしたstrへのデータ型。そのパンダではしばらくの間、私は 'オブジェクト'のデータ型は同じ種類の文字列だと思った。 –

+0

はい、明らかに文字列です。しかし、必ずしもそうではありません、あなたは[this]をチェックすることができます(http://stackoverflow.com/questions/42672552/pandas-cast-column-to-string-does-not-work/42672574#42672574) – jezrael

関連する問題