Pandas возможно ли, чтобы маска игнорировала все нечисловые значения? - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь замаскировать значения в фрейме данных, но получаю ошибки, когда вводю строки в фрейм данных.

Моя цель - взять любое значение меньше 1 и превратить его в NaN . У меня есть строки, которые я не хочу превращать в NaN (поскольку строки не могут быть меньше 1).

Я просто использую эту команду:

df = df.mask(df.lt(1)) 

но получаю эту ошибку -

TypeError: '<' not supported between instances of 'str' and 'int'

Есть ли способ избавиться от go мучений, связанных с созданием нового DF и последующим его слиянием? Есть ли способ игнорировать что-либо нечисловое c?

Вот пример с данными:

import pandas as pd 

# intialise data of lists. 
df = pd.DataFrame({"A":[12, 4, 5, 44, 1], 
                   "B":[5, 2, 54, 3, 2], 
                   "C":[20, 16, 7, 3, 8], 
                   "D":[14, 3, 17, 2, 6]}) 
df = df.mask(df.lt(19)) 
print(df)
# result
#       A     B     C   D
# 0   NaN   NaN  20.0 NaN
# 1   NaN   NaN   NaN NaN
# 2   NaN  54.0   NaN NaN
# 3  44.0   NaN   NaN NaN
# 4   NaN   NaN   NaN NaN

df1 = pd.DataFrame({"A":["Bob", "Mary", "John", "Paul", "Chris"], 
                   "B":[5, 2, 54, 3, 2], 
                   "C":[20, 16, 7, 3, 8], 
                   "D":[14, 3, 17, 2, 6]}) 
df1 = df1.mask(df1.lt(19)) 
print(df1)

error - TypeError: '<' not supported between instances of 'numpy.ndarray' and 'int'

1 Ответ

1 голос
/ 13 июля 2020

Что ж, мы можем фильтровать по dtypes и изменять только эти столбцы:

Отредактировано

df1 = pd.DataFrame({"A":["Bob", "Mary", "John", "Paul", "Chris"], 
                   "B":[5, 2, 54, 3, 2], 
                   "C":[20, 16, 7, 3, 8], 
                   "D":[14, 3, 17, 2, 6]}) 
cols = df1.select_dtypes(include=['number']).columns
df1[cols] = df1[cols].mask(df1[cols] < 19)
df1

В качестве альтернативы - cols = df1.columns[[i for i,j in enumerate(df1.dtypes.tolist()) for x in [np.dtype('float64'),np.dtype('int64')] if j == x]] также работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...