Evidenzia le celle del dataframe in base a più condizioni in Python
Nov 10 2020
Dato un piccolo set di dati come segue:
id room area situation
0 1 A-102 world under construction
1 2 NaN 24 under construction
2 3 B309 NaN NaN
3 4 C·102 25 under decoration
4 5 E_1089 hello under decoration
5 6 27 NaN under plan
6 7 27 NaN NaN
Grazie al codice di @jezrael a questo link , sono in grado di ottenere il risultato di cui avevo bisogno:
a = np.where(df.room.str.match('^[a-zA-Z\d\-]*$', na = False), None, 'incorrect room name') b = np.where(df.area.str.contains('^\d+$', na = True), None,
'area is not a numbers')
c = np.where(df.situation.str.contains('under decoration', na = False),
'decoration is in the content', None)
f = (lambda x: '; '.join(y for y in x if pd.notna(y))
if any(pd.notna(np.array(x))) else np.nan )
df['check'] = [f(x) for x in zip(a,b,c)]
print(df)
id room area situation \
0 1 A-102 world under construction
1 2 NaN 24 under construction
2 3 B309 NaN NaN
3 4 C·102 25 under decoration
4 5 E_1089 hello under decoration
5 6 27 NaN under plan
6 7 27 NaN NaN
check
0 area is not a numbers
1 incorrect room name
2 NaN
3 incorrect room name;decoration is in the content
4 incorrect room name;area is not a numbers;deco...
5 NaN
6 NaN
Ma ora vorrei andare oltre e evidenziare le celle problematiche dalle room, area, situationcolonne, quindi salvare il dataframe come file Excel.
Come potrei farlo in Pandas (meglio) o altri pacchetti Python?
Grazie in anticipo
Risposte
1 jezrael Nov 10 2020 at 09:47
L'idea è creare funzioni personalizzate per il ritorno DataFramedegli stili e riutilizzare le m1, m2, m3maschere booleane:
m1 = df.room.str.match('^[a-zA-Z\d\-]*$', na = False) m2 = df.area.str.contains('^\d+$', na = True)
m3 = df.situation.str.contains('under decoration', na = False)
a = np.where(m1, None, 'incorrect room name')
b = np.where(m2, None, 'area is not a numbers')
c = np.where(m3, 'decoration is in the content', None)
f = (lambda x: '; '.join(y for y in x if pd.notna(y))
if any(pd.notna(np.array(x))) else np.nan )
df['check'] = [f(x) for x in zip(a, b, c)]
print(df)
def highlight(x):
c1 = 'background-color: yellow'
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
df1['room'] = np.where(m1, '', c1)
df1['area'] = np.where(m2, '', c1)
df1['situation'] = np.where(m3, c1, '')
# print(df1)
return df1
df.style.apply(highlight, axis = None).to_excel('test.xlsx', index = False)