Réglage

J'applique séquentiellement deux méthodes à un objet styler pandas, comme

df.style \
  .applymap(mapping1, subset=["column_a"]) \
  .applymap(mapping2, subset=["column_b"])

Les mappages que j'applique varient cependant. Par exemple, je me rends compte que j'aimerais ajouter un nouveau mappage appelé mapping3 pour la colonne column_c. Par souci d'extensibilité, j'aimerais pouvoir ajouter rapidement un mappage et l'appliquer également, sans avoir à ajouter également une ligne à l'extrait de code ci-dessus.

Ma question

Je veux fournir des mappages de manière flexible et les appliquer tous à df, où l'entrée est une liste de mappages (comme mappings = [(mapping1, col1), (mapping2, col2), (mapping3, col3)] et la sortie est un dataframe stylé.

Même si cette question utilise l'exemple des dataframes stylisés, je pense que cette question ne se limite pas au chaînage d'objets styler en soi. Je pense que ce serait pertinent pour tous les types de méthodes de chaînage chez les pandas.

Exemple reproductible

import pandas as pd

df = pd.DataFrame({
    "column_a": [-1, -2, 3, 4],
    "column_b": ["good", "bad", "neutral", "amazing"],
    "column_c": [0.1, 0.9, 0.5, 1]
})


def mapping1(val):
    if val < 0:
        color = "red"
    elif val > 0:
        color = "green"
    else:
        color = "black"
    return "background-color: %s" % color


def mapping2(val):
    if val == "amazing":
        color = "purple"
    else:
        color = "black"
    return "color: %s" % color


def mapping3(val):
    if val < 0.8:
        color = "orange"
    if val >= 0.8:
        color = "green"
    return "color: %s" % color


styler = df.style \
    .applymap(mapping1, subset=['column_a']) \
    .applymap(mapping2, subset=["column_b"]) \
    .applymap(mapping3, subset=["column_c"])

styler
4
KenHBS 1 sept. 2020 à 13:47

2 réponses

Meilleure réponse

Nous pouvons exécuter applymap dans une boucle:

mappings = [
    (mapping1, 'column_a'),
    (mapping2, 'column_b'),
    (mapping3, 'column_c')]

x = df.style
for m in mappings:
    x = x.applymap(m[0], m[1])

x
3
perl 1 sept. 2020 à 11:11

Voici un moyen d'utiliser style.apply et d'inverser le dict

mappings = [(mapping1, 'column_a'), (mapping2, 'column_b'), (mapping3, 'column_c')]

df.style.apply({v:k for k,v in mappings})

enter image description here

4
anky 1 sept. 2020 à 11:16