Есть ли какая-либо функция Python для проверки значений Nan в понимании списка без изменения - PullRequest
0 голосов
/ 08 апреля 2019

Я пишу код, чтобы взять значения из каждого столбца фрейма данных и выполнить его обработку. Я получаю исключение всякий раз, когда есть значение NaN. Я не хочу бросать столбцы с Нан. Ранее я решил эту проблему, просто перехватывая исключения, но теперь я не могу сделать то же самое, что и здесь, используя списочные выражения. Может кто-нибудь предложить правильный способ сделать это? Ранее я решил это так:

for index, row in df_work.iterrows():
        descrip = row['description']
        try:
            r = Rake()
            r.extract_keywords_from_text(descrip)
            key_words_dict_scores = r.get_word_degrees()
            row['Key_words'] = list(key_words_dict_scores.keys())
        except Exception as e:
            print(e)
            row['Key_words'] = ''

Я хочу сделать то же самое здесь:

df_work['specialties'] = [','.join(x) for x in df_work['specialties'].map(lambda x: x.lower().replace(' ','').split(',')).values]
    df_work['industry'] = [','.join(x) for x in df_work['industry'].map(lambda x: x.lower().replace(' ','').split(',')).values]
    df_work['type'] = [','.join(x) for x in df_work['type'].map(lambda x: x.lower().replace(' ','').split(',')).values]

Я получаю эту ошибку в коде выше:

'float' object has no attribute 'lower'

Столбец Специальности содержит такие данные:

df_work.loc['TOTAL', 'specialties']

ВЫХОД >> 'Oil & Gas - Exploration & Production,Upstream,Refining,Trading,Shipping,Marketing,Energy,Crude Oil,Petroleum,Petrochemicals,Liquified Natural Gas,Renewable Energy,Drilling Engineering,Completion & Intervention Engineering,Geology,Geoscientists,IT'

type(df_work.loc['TOTAL', 'specialties'])

ВЫХОД >> str

Ожидаемый результат после запуска приведенного выше кода должен быть: ВЫХОД >> 'oil&gas-exploration&production,upstream,refining,trading,shipping,marketing,energy,crudeoil,petroleum,petrochemicals,liquifiednaturalgas,renewableenergy,drillingengineering,completion&interventionengineering,geology,geoscientists,it'

type(df_work.loc['TOTAL', 'specialties'])

ВЫХОД >> str

1 Ответ

0 голосов
/ 08 апреля 2019

Здесь возможно использование функций pandas, работающих с NaN s nice:

df_work['specialties'] = df_work['specialties'].str.lower().str.replace(' ','')

Если необходимо работать с NaN s, протестируйте его с помощью isinstance() и if-else:

df_work['specialties'] = (df_work['specialties']
        .map(lambda x: x.lower().replace(' ','') if isinstance(x, str) else x))

И решение для понимания списка:

df_work['specialties'] = [x.lower().replace(' ','') 
                          if isinstance(x, str) 
                          else x 
                          for x in df_work['specialties']]

Образец :

df_work = pd.DataFrame({'specialties':['First spec, Sec spec','A Vb,ds RT', np.nan]})
print (df_work)
            specialties
0  First spec, Sec spec
1            A Vb,ds RT
2                   NaN

df_work['specialties'] = [x.lower().replace(' ','') 
                          if isinstance(x, str) 
                          else x 
                          for x in df_work['specialties']]
print (df_work)
         specialties
0  firstspec,secspec
1           avb,dsrt
2                NaN
...