Заменить числовые значения на NaN в Python - PullRequest
1 голос
/ 26 июня 2019

Я хочу заменить все числовые значения в столбце DataFrame на NaN

Ввод

A       B       C
test    foo     xyz
hit     bar     10
hit     fish    90
hit     NaN     abc
test    val     20
test    val     90

Желаемый вывод:

A       B       C
test    foo     xyz
hit     bar     NaN
hit     fish    NaN
hit     NaN     abc
test    val     NaN
test    val     NaN

Я пробовал следующее:

db_old.loc[db_old['Current Value'].istype(float), db_old['Current Value']] = np.nan

, но возвращает:

AttributeError: Объект 'Series' не имеет атрибута 'istype'

Есть предложения?

Спасибо

1 Ответ

3 голосов
/ 26 июня 2019

Вы можете маскировать числовые значения, используя to_numeric:

df['C'] = df['C'].mask(pd.to_numeric(df['C'], errors='coerce').notna())
df
      A     B    C
0  test   foo  xyz
1   hit   bar  NaN
2   hit  fish  NaN
3   hit   NaN  abc
4  test   val  NaN
5  test   val  NaN

to_numeric - наиболее общее решение, которое должно работать независимо от того, есть ли у вас столбец строк или смешанных объектов.


Если это столбец строк, и вы пытаетесь сохранить только строки букв, str.isalpha может быть достаточно:

df['C'] = df['C'].where(df['C'].str.isalpha())
df
      A     B    C
0  test   foo  xyz
1   hit   bar  NaN
2   hit  fish  NaN
3   hit   NaN  abc
4  test   val  NaN
5  test   val  NaN

Хотя это специально сохраняет строкикоторые не имеют цифр.


Если у вас есть столбец со смешанными объектами, вот еще одно решение, использующее str.match (на самом деле любой метод str с флагом na) с na=False:

df['C'] = ['xyz', 10, 90, 'abc', 20, 90]

df['C'] = df['C'].where(df['C'].str.match(r'\D+$', na=False))
df
      A     B    C
0  test   foo  xyz
1   hit   bar  NaN
2   hit  fish  NaN
3   hit   NaN  abc
4  test   val  NaN
5  test   val  NaN
...