我有一个数据框(在Python中),如下所示:
A B C D E F G H
0 T-1 2 3 - M-7 2 2
1 T-2 5 4 2 M-7 4 3
2 T-3 - - 3 M-7 9 4
3 T-4 6 - 4 M-7 - 9 5
4 T-5 - 1 5 M-7 8 6
我想用NaN
替换破折号(排除 A列和E列中的破折号)。
我尝试了df.replace('-', np.nan)
。它最终也替换了A列和E列的整个单元格。我想我可以使用df[column_name].replace('-',np.nan)
但是我必须分别为每一列应用它。
有没有其他方法,这是有效的,并适用于具有类似限制的任意数量的列?
答案 0 :(得分:1)
这应该有效。
df = pd.DataFrame({'A': list('abcde'),
'B': ['T-1', 'T-2', 'T-3', 'T-4', 'T-5'],
'C': ['a', '-', 'c', 'd', '-'],
'D': ['-', 'b', 'c', 'd', 'e'],
'E': ['M-7', 'M-7', 'M-7', 'M-7', 'M-7'],
'F': ['a', '-', 'c', '-', '-'],
'G': ['a', 'b', 'c', 'd', '-'],
'H': ['a', 'b', '-', 'd', '-']
})
df = df.astype(str)
s = df.applymap(lambda x: re.sub(r'^-$', str(np.NaN), x))
<强>输出:强>
A B C D E F G H
0 a T-1 a nan M-7 a a a
1 b T-2 nan b M-7 nan b b
2 c T-3 c c M-7 c c nan
3 d T-4 d d M-7 nan d d
4 e T-5 nan e M-7 nan nan nan
答案 1 :(得分:1)
In [18]: df[df.columns.drop(['A','E'])] = \
df[df.columns.drop(['A','E'])].replace('-', np.nan)
In [19]: df
Out[19]:
A B C D E F G H
0 a T-1 a NaN M-7 a a a
1 b T-2 NaN b M-7 NaN b b
2 c T-3 c c M-7 c c NaN
3 d T-4 d d M-7 NaN d d
4 e T-5 NaN e M-7 NaN NaN NaN