J'ai un dataframe comme:
Name Age Class Subject A 13 7 Maths, Bio B 17 10 English, Physics
Je veux ajouter une nouvelle colonne nommée Subject, qui devrait inclure les noms de colonne (ayant 1) comme valeurs du champ subject, montré ci-dessous :
Name Age Class Maths English Physics Bio Chemistry A 13 7 1 None None 1 None B 17 10 None 1 1 None None
J'ai essayé d'utiliser plusieurs méthodes, mais cela prend plus de temps que d'habitude.
3 Réponses :
Vous pouvez utiliser appliquer
avec la fonction lambda
.
df['Subject'] = (df == '1').apply(lambda x: ','.join(df.columns[x]), axis=1) df = df.iloc[:, [0,1,2,-1]] df Name Age Class Subject 0 A 13 7 Maths, Bio 1 B 17 10 English, Physics
Une méthode facile à lire:
subjects = ['Maths', 'English', 'Physics', 'Bio', 'Chemistry'] df['Subject'] = "" for row in range(len(df.index)): output = [] for i, col in enumerate(df.loc[df.index[row], subjects]): if col == 1: output.append(str(subjects[i])) df.at[df.index[row], 'Subject'] = ", ".join(output)
#extract subjects columns subjects = df.iloc[:,3:].columns #identify columns that are not na per row notnull = df.filter(subjects).notna().to_numpy() #get the non null columns and assign to subject column #... still thinking of a non python loop ... glad if anyone can drop a better replacement df['subjects'] = [subjects[row].str.cat(sep=', ') for row in notnull] #drop subjects list df.drop(subjects,axis=1) Name Age Class subjects 0 A 13 7 Maths, Bio 1 B 17 10 English, Physics
Méthode soignée! +1