Как мне создать функцию, которая может: заменить 0 на NaN? - PullRequest
0 голосов
/ 04 августа 2020

Как мне создать функцию, которая может: заменять (0.0) на NaN, удалять подчеркивания, преобразовывать чистые строки в тип данных с плавающей запятой или иным образом возвращать преобразованные данные?

До сих пор я пробовал следующее:

def score_cleaner(underscored): 
    if underscored == '_000':
         return np.NaN
           
long_data['Numeric Score']= long_data['Score'].apply(lambda x:(float(x.replace('_',''))))

long_data ['Numeric Score']= long_data ['Score'].apply(score_cleaner) 

Однако это привело либо к выводу бесконечных «NaN», либо ко всем числовым значениям, а не к комбинации двух, где 0,0 конвертируются в NaN, а остальные данные - остался один:

PID_Sex PID_Age ManipulationScoreFace IDCondition Numeric Score
103 Female  18  Symmetry    _005    101 Manipulated NaN
106 Female  19  Symmetry    _000    101 Manipulated NaN
106 Male    22  Symmetry    _000    101 Manipulated NaN
109 Male    20  Symmetry    _000    101 Manipulated NaN
112 Female  18  Symmetry    _000    101 Manipulated NaN 
115 Female  18  Symmetry    _000    101 Manipulated NaN
118 Female  19  Symmetry    _003    101 Manipulated NaN
121 Female  18  Symmetry    _000    101 Manipulated NaN
124 Female  19  Symmetry    _004    101 Manipulated NaN
127 Female  19  Symmetry    _005    101 Manipulated NaN

PID_Sex PID_Age ManipulationScoreFace IDConditionNumericScore
103 Female  18  Symmetry    _005    101 Manipulated 5.0
106 Female  19  Symmetry    _000    101 Manipulated 0.0
106 Male    22  Symmetry    _000    101 Manipulated 0.0
109 Male    20  Symmetry    _000    101 Manipulated 0.0
112 Female  18  Symmetry    _000    101 Manipulated 0.0
115 Female  18  Symmetry    _000    101 Manipulated 0.0
118 Female  19  Symmetry    _003    101 Manipulated 3.0
121 Female  18  Symmetry    _000    101 Manipulated 0.0
124 Female  19  Symmetry    _004    101 Manipulated 4.0
127 Female  19  Symmetry    _005    101 Manipulated 5.0

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Я не совсем понимаю, что вы хотите, поэтому вот два наиболее вероятных варианта:

Вариант 1

Преобразование столбца в тип float с преобразованием '_000' в np.nan, а остальные в числовые c значения:

long_data['Numeric Score'] = long_data['Score'].str.replace('_', '').astype(float).replace(0., np.nan)

или как определение функции:

def score_cleaner(underscore):
    return underscore.str.replace(
        '_', '').astype(float).replace(0., np.nan)

long_data['Numeric Score'] = score_cleaner(long_data['Score'])

Вариант 2

Преобразовать столбец в тип object с преобразованием '_000' в строку 'NaN', а остальное оставить как есть:

long_data['Numeric Score'] = long_data['Score'].str.replace('_000', 'NaN')

и снова определяется как функция:

def score_cleaner(underscore):
    return underscore.str.replace('_000', 'NaN')

long_data['Numeric Score'] = score_cleaner(long_data['Score'])
0 голосов
/ 04 августа 2020

Вы можете использовать это:

df['Numeric Score'] = df['Score'].apply(lambda x:(float(x.replace('_',''))))
df['Numeric Score'][df['Score'] == '_000'] = np.NaN

Чтобы создать функцию, вы можете использовать это:

def score_cleaner(underscored): 
    if underscored == '_000':
         return np.NaN        
    else:
        return float(underscored.replace('_',''))

long_data ['Numeric Score']= long_data['Score'].map(score_cleaner) 
...