如何在Python数据框中用NaN替换破折号?

6

I have a dataframe (in Python) as follows:

      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

我希望将短划线(不包括 A 和 E 列中的短划线)替换为 NaN
我尝试过使用 df.replace('-', np.nan)。但它会将 A 和 E 列的整个单元格也替换掉。我想我可以使用 df[column_name].replace('-',np.nan),但这样我需要为每一列单独应用此方法。
是否有其他有效的方法,可以对任意数量的列进行类似限制的操作?

2
df.replace('-', np.nan) 应该可以工作。不确定为什么对你不起作用。 - Joe T. Boka
1
正如我在问题中提到的那样,df.replace('-', np.nan) 的功能超出了我的需求。我希望A列和E列保持不变,但其他列的破折号应该被替换。 - dravid07
1
使用 df.replace('-', np.nan) 不应该改变 A 和 E 列中的任何内容。它只应该替换其他列中的破折号。它应该完全符合您的要求,所以我不明白为什么它对您不起作用。我无法重现这个问题。 - Joe T. Boka
3个回答

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

你的方法很棒。但是对于我提供的数据框,我遇到了一个错误:TypeError: ('expected string or bytes-like object', 'occurred at index B ') - dravid07
将数据框中的所有列转换为字符串类型,就可以像这样使用:df.astype(str)。 - Riley Hun

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

0

只需使用 df=df.replace('-', np.nan)


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
我认为这并没有完全回答问题,这种方法曾被提出并被拒绝。 - Nikolay Zakirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接