2 votes

Remplir des valeurs qui ne sont pas explicitement indiquées dans la base de données

Comment ajouter les valeurs manquantes d'une colonne à un dataframe en se basant sur une liste de valeurs possibles.
la liste des valeurs se présente comme suit :

type = ['type1','type2','type3','type4']

Voici le code pour df :

import pandas as pd

data = {
    '1': ['fall',  'type2', 'MATH 1234', 'Yes'],
    '2': ['fall',  'type1', 'MATH 1234', 'Yes']
}
columns=['term', 'type', 'course', 'offered']

df = pd.DataFrame.from_dict(
    data=data, orient='index'
)
df.columns = columns

ressemble à un dataframe :

    term    type    course  offered
1   fall    type2   MATH 1234   Yes
2   fall    type1   MATH 1234   Yes

la sortie souhaitée :

    term    type    course  offered
1   fall    type2   MATH 1234   Yes
2   fall    type1   MATH 1234   Yes
3   fall    type3   MATH 1234   NO
4   fall    type4   MATH 1234   NO

Les types 3 et 4 ne sont pas proposés pour MATH 1234 à l'automne, par conséquent l'offre doit être "NON".

Des idées sur la manière de gérer cette situation ?

2voto

Zoff Dino Points 5010

Si je comprends bien, vous voulez créer toutes les combinaisons de term , type , course et de les remplir avec No si la même combinaison ne peut être trouvée dans df .

Si c'est le cas, essayez ceci :

terms = df["term"].unique()
types = ["type1", "type2", "type3", "type4"]
courses = df["course"].unique()

result = (
    pd.MultiIndex.from_product([terms, types, courses], names=["term", "type", "course"])
    .to_frame(index=None)
    .merge(df, on=["term", "type", "course"], how="left")
    .fillna("No")
)

1voto

sammywemmy Points 14854

L'objectif est ici d'obtenir les lignes manquantes pour la combinaison de (term, course) avec les nouvelles valeurs de type . L'une des options consiste à utiliser complet de pyjanitor pour faire apparaître les lignes manquantes :

# pip install pyjanitor
import pandas as pd
import janitor

df.complete(['term', 'course'], {'type': type}, fill_value = 'NO')

   term   type     course offered
0  fall  type1  MATH 1234     Yes
1  fall  type2  MATH 1234     Yes
2  fall  type3  MATH 1234      NO
3  fall  type4  MATH 1234      NO

complet prend un nombre variable d'arguments - le dictionnaire nous permet de passer les nouvelles valeurs de type .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X