Cette ligne renvoie les 4 premières lignes de la trame combined
de données pourfeature_a
combined.iloc[0:4]["feature_a"]
Comme prévu, cette ligne suivante renvoie les 2e, 4e et 16e lignes de la trame de données pour la colonne feature_a
:
combined.iloc[[1,3,15]]["feature_a"]
Cette ligne définit les 4 premières lignes de la trame de données pour feature_a
to 77
.
combined.iloc[0:4]["feature_a"] = 77
Cette ligne fait quelque chose. Des calculs sont en cours, car cela prend plus de temps lorsqu'il est appliqué à une liste plus longue.
combined.iloc[[1,3,15]]["feature_a"] = 88
Les 2e, 4e et 16e rangées ne sont pas définies 88
lorsque vérifiées avec ceci:
combined.iloc[[1,3,15]]["feature_a"]
Comment puis-je définir une liste arbitraire de lignes d'une colonne d'une trame de données sur une valeur sans prendre un détour de codage massif?
Ce scénario semble être assez simple et courant.
Réponses:
Si vous inversez les sélecteurs et sélectionnez d'abord par colonne, cela fonctionnera correctement:
Code:
Pourquoi?
Lorsque vous avez fait la première (méthode non fonctionnelle), vous sélectionnez une section non contiguë du bloc de données. Vous devriez avoir reçu l'avertissement:
En effet, deux opérations indépendantes ont lieu.
combined.iloc[[1,3,15]]
crée un nouveau cadre de données de seulement trois lignes, et le cadre est nécessairement copié. ensuite...["feature_a"]
mais elle est sélectionnée par rapport à la copie.La tâche revient donc à la copie. Il existe différentes façons de résoudre ce problème, mais dans ce cas, il est plus facile (et moins cher) de sélectionner la colonne en premier, puis de sélectionner des parties des colonnes à affecter.
Code de test:
Résultats:
la source