J'ai un dataframe , où j'ai 1 colonne, qui contient des noms de colonne remplissant certaines conditions pour chaque ligne.
C'est comme si les colonnes de dataframe étaient Index, Col1, Col2, Col3 , Col_Name . Où Col_Name a soit Col1 ou Col2 ou Col3 pour chaque ligne.
Maintenant, dans une nouvelle colonne, dites Col_New, je veux une sortie pour chaque ligne, par exemple si la 5ème ligne Col_Name mentionne Col_1 , puis la valeur de Col_1 code > à la 5e rangée.
Je suis désolé de ne pas pouvoir publier le code sur lequel je travaille, donc j'ai donné cet exemple hypothétique.
Obligatoire pour toute aide, merci.
3 Réponses :
IIUC vous pouvez utiliser:
df['Col_New'] = df.reset_index().apply(lambda x: df.at[int(x['index']), int(x[13])], axis=1)
1 2 3 13 Col_New
0 0.548814 0.715189 0.602763 3 0.602763
1 0.544883 0.423655 0.645894 3 0.645894
2 0.437587 0.891773 0.963663 1 0.437587
3 0.383442 0.791725 0.528895 3 0.528895
4 0.568045 0.925597 0.071036 1 0.568045
5 0.087129 0.020218 0.832620 1 0.087129
6 0.778157 0.870012 0.978618 1 0.778157
7 0.799159 0.461479 0.780529 2 0.461479
8 0.118274 0.639921 0.143353 2 0.639921
9 0.944669 0.521848 0.414662 3 0.414662
cols = [1, 2, 3]
np.random.seed(0)
df = pd.DataFrame(np.random.rand(10, 3), columns=cols)
df[13] = np.random.choice(cols, 10)
print(df)
1 2 3 13
0 0.548814 0.715189 0.602763 3
1 0.544883 0.423655 0.645894 3
2 0.437587 0.891773 0.963663 1
3 0.383442 0.791725 0.528895 3
4 0.568045 0.925597 0.071036 1
5 0.087129 0.020218 0.832620 1
6 0.778157 0.870012 0.978618 1
7 0.799159 0.461479 0.780529 2
8 0.118274 0.639921 0.143353 2
9 0.944669 0.521848 0.414662 3
[out]
Col1 Col2 Col3 Col_Name Col_New 0 0.833988 0.939254 0.256450 Col2 0.939254 1 0.675909 0.609494 0.641944 Col3 0.641944 2 0.877474 0.971299 0.218273 Col3 0.218273 3 0.201189 0.265742 0.800580 Col2 0.265742 4 0.397945 0.135153 0.941313 Col2 0.135153 5 0.666252 0.697983 0.164768 Col2 0.697983 6 0.863377 0.839421 0.601316 Col2 0.839421 7 0.138975 0.731359 0.379258 Col3 0.379258 8 0.412148 0.541033 0.197861 Col2 0.541033 9 0.980040 0.506752 0.823274 Col3 0.823274
Obtention d'une erreur KeyError ('Col_Name', s'est produite à l'index 0 ')
Je suppose que c'est un problème avec mon nom de colonne, en fait la colonne Col_Name dans mon exemple hypothétique est en fait 4 qui est une valeur numérique plutôt qu'une chaîne, par conséquent cette erreur peut se produire. Je vais d'abord le convertir en chaîne, puis appliquer le lambda que vous avez mentionné. Mettra à jour les résultats ici.
pouvez-vous réessayer s'il vous plaît, j'ai mis à jour ma réponse avec vos conversions de noms
Chris pouvez-vous renommer Col_Name comme n'importe quel entier, disons 13, puis vérifier si cela fonctionne
J'ai ajouté un exemple basé sur des références de colonnes entières qui fonctionne pour moi ... pouvez-vous vérifier?
En l'essayant, une erreur indiquant que l'objet str n'a pas d'attribut astype La gestion du type de données est toujours un cauchemar pour moi :(
Je l'ai mis à jour pour supprimer .astype . utilisez plutôt int ()
Je comprends que Chris essaiera de comprendre quelque chose. Merci beaucoup pour votre aide!
Résolu Chris. Un petit tweak immature, renommé la colonne entière en chaîne et ensuite utilisé votre lambda .... Merci encore, vous êtes une bouée de sauvetage
En utilisant l'exemple DataFrame de Chris A.
Vous pouvez le faire comme ceci:
cols = ['Col1', 'Col2', 'Col3'] df = pd.DataFrame(np.random.rand(10, 3), columns=cols) df['Col_Name'] = np.random.choice(cols, 10) print(df) df['Col_New'] = [df.loc[df.index[i],j]for i,j in enumerate(df.Col_Name)] print(df)
Dans les pandas est pour cette fonction DataFrame.lookup , il semble également avoir besoin des mêmes types de valeurs dans les colonnes et dans la colonne de recherche, il est donc possible de convertir les deux en chaînes:
np.random.seed(123) cols = [1, 2, 3] df = pd.DataFrame(np.random.randint(10, size=(5, 3)), columns=cols).rename(columns=str) df['Col_Name'] = np.random.choice(cols, 5) df['Col_New'] = df.lookup(df.index, df['Col_Name'].astype(str)) print(df) 1 2 3 Col_Name Col_New 0 2 2 6 3 6 1 1 3 9 2 3 2 6 1 0 1 6 3 1 9 0 1 1 4 0 9 3 1 0
Je peux penser à appliquer une boucle for, mais cela ralentira considérablement mon code, je souhaite donc connaître une meilleure méthode.
Je suis un peu confus, mais ne pouvez-vous pas appliquer à Col_New la même condition que vous appliquez pour choisir la chaîne dans Col_Name?
@micric Je suppose que si j'entre dans trop de détails sans publier le code, cela rendra ma question déroutante. Cependant, j'avais utilisé np.argsort pour arriver à un tableau de noms de colonnes dans l'ordre décroissant en fonction de la valeur de chaque ligne. Maintenant w.r.t. une colonne, j'ai besoin de la valeur correspondante.