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 — не волнуйтесь, исходные столбцы не заменяются