Как сравнить столбцы, содержащие значение, не являющееся числовым?

python #excel #pandas #dataframe

#python #excel #панды #фрейм данных

Вопрос:

Сравните COL1 и COL2, затем выделите COL1, если его значение больше или равно COL2. COL1 содержит «тест», который не является числовым. Мне нужно пропустить эту строку и сравнить остальные из них. Как этого добиться? Спасибо!

введите описание изображения здесь

Комментарии:

1. Каков ваш код для выделения?

2. @jezrael не беспокойтесь о выделении части. Просто сравнение. Спасибо.

3. @FivePlyPaper есть какое-либо другое решение? ваш подход был бы безумно медленным, если бы это был длинный лист.

4. Что вы подразумеваете под «выделением» (цветом фона?)

5. @Corralien да.

Ответ №1:

Если заменить нечисловые пропущенные значения на to_numeric с errors='coerce' , вы можете сравнить оба столбца Series.ge на большее или равное, исходные столбцы не заменяются:

 mask = pd.to_numeric(df['COL1'], errors='coerce').ge(df['COL2'])

df['new'] = np.where(mask, 'greater or equal', 'not greater or equal')
 

Если требуется также другой вывод для нечислового:

 df = pd.DataFrame({'COL1':['text', 1,2],
                   'COL2':[1,2,0]})

s = pd.to_numeric(df['COL1'], errors='coerce')
mask1 = s.isna() amp; df['COL1'].notna()
mask2 = s.ge(df['COL2'])

df['new'] = np.select([mask1,mask2],
                      ['non numeric','greater or equal'],
                       default='not greater or equal')
print (df)
   COL1  COL2                   new
0  text     1           non numeric
1     1     2  not greater or equal
2     2     0      greater or equal
 

Для полноты решения для выделения COL1 :

 df = pd.DataFrame({'COL1':['text', 1,2],
                   'COL2':[1,2,0]})


def color(x): 
   c1 = 'background-color: red'
   c2 = 'background-color: green'
   c3 = 'background-color: yellow'
   c = ''

   s = pd.to_numeric(df['COL1'], errors='coerce')
   m1 = s.isna() amp; df['COL1'].notna()
   m2 = s.ge(df['COL2'])

   df1 = pd.DataFrame(c, index=x.index, columns=x.columns)
   df1['COL1'] = np.select([m1, m2], [c1, c2], default=c3)
   return df1

df.style.apply(color,axis=None).to_excel('format_file.xlsx', index=False, engine='openpyxl')
 

Комментарии:

1. Но мне нужно сохранить это значение. Не могу его заменить. Спасибо.

2. @buzzmind — не волнуйтесь, исходные столбцы не заменяются