在没有列名的情况下跨数据框替换值的优雅方法

Elegant way to replace values across dataframe without column names

我有一个如下所示的数据框

df = pd.DataFrame({'person_id': [101,101,101,101],
                        'start_date':['NA-NA-NA NA:NA:NA','Nil','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM'],
                        'desc':['-','- ',' - ','test-date'],
                        'type':['test-date','actual-version','depat-head','oxygen-parlor']})

我想用 np.nan

替换值 NA-NA-NA NA:NA:NANil-

我尝试了以下

df.replace(['NA-NA-NA NA:NA:NA','Nil','-', np.nan)
df.dropna(subset=['person_id','start_date','desc','type'], how='any')

虽然上面的方法在一定程度上有效,但它并不准确,因为它没有考虑带有 spaces - - 等的连字符。请注意 [=不应替换 type 列中的 15=]。

可以帮助我在不使用列名的情况下跨数据框替换精确值(但 space 个字符除外)吗?

我希望我的输出如下所示

person_id              start_date               desc           type
  101               06/06/2014 05:00:00 AM    test-date    oxygen-parlor

您可以使用正则表达式替换整个数据框:

terms = ['NA-NA-NA NA:NA:NA', 'Nil', '-']
regex = r'^\s*(?:' + '|'.join(terms) + r')\s*$'
df = df.replace(regex, np.nan, regex=True)

这里使用的正则表达式模式是^\s*(?:NA-NA-NA NA:NA:NA|Nil|-)\s*$,并且只会匹配NA字符串,-Nil当它们是一列的全部内容时(但不仅仅是子字符串)。

df.replace(regex=['Nil|NA|^-'], value=np.nan).dropna()
         person_id              start_date       desc           type
3        101            06/06/2014 05:00:00 AM  test-date  oxygen-parlor