【问题标题】:How to replace dashes in a python dataframe by NaN?如何用 NaN 替换 python 数据框中的破折号?
【发布时间】:2017-06-10 07:21:32
【问题描述】:

我有一个数据框(在 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),但是我必须分别为每一列应用它。

有没有其他有效的方法,并且适用于具有类似限制的任意数量的列?

【问题讨论】:

  • df.replace('-', np.nan) 应该可以工作。不知道为什么它不适合你。
  • 正如我在问题中提到的,df.replace('-', np.nan) 的工作量超出了我的要求。我希望 A 列和 E 列保持原样,但应替换其他列的破折号。
  • 使用df.replace('-', np.nan) 不应该改变A 和E 列中的任何内容。它应该只替换其他列中的破折号。它应该完全符合您的要求,所以我不明白为什么它不适合您。我无法重现此问题。

标签: python pandas dataframe nan


【解决方案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

【讨论】:

    【解决方案2】:

    这应该可以。

    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 ').
    • 将数据框中的所有列转换为字符串类型,它将为您工作,如下所示:df.astype(str)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2013-10-09
    • 2011-08-28
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多