Les Pandas - conditionnellement sélectionnez la colonne source de données pour une nouvelle colonne basée sur des valeurs de ligne
Est-il pandas fonction qui permet la sélection de différentes colonnes en fonction d'une condition? Ceci est analogue à une instruction SQL Select. Par exemple, dire que j'ai la suite DataFrame:
foo = DataFrame(
[['USA',1,2],
['Canada',3,4],
['Canada',5,6]],
columns = ('Country', 'x', 'y')
)
Je veux sélectionner à partir de la colonne " x "Pays==les "USA", et à partir de la colonne " y " quand le Pays=='Canada', résultant en quelque chose comme ce qui suit:
Country x y z
0 USA 1 2 1
1 Canada 3 4 4
2 Canada 5 6 6
[3 rows x 4 columns]
D'où vient la colonne
z serait le "combiné" colonne, la colonne de x ou y selon les Pays
z
venir?z serait le "combiné" colonne, la colonne de x ou y selon les Pays
OriginalL'auteur aensm | 2014-05-29
Vous devez vous connecter pour publier un commentaire.
À l'aide de
DataFrame.où
'sother
argument etpandas.concat
:Si vous voulez
z
comme nom de colonne, indiquezkeys
:OriginalL'auteur falsetru
Ce serait le travail:
Vous pouvez utiliser
loc
:MODIFIER
Bien que lourd à l'aide de
loc
à l'échelle de mieux avec de plus grands dataframes que l'ici est appelé pour chaque ligne, tout en utilisant boolean indexation être vectorisées.L'autre moyen serait d'utiliser boolean indexation voir ma réponse
Je ne pense pas que, loc travaille, depuis de masquage booléen produit toujours une copie de la DataFrame, plutôt que d'un point de vue.
si vous êtes seulement 1 ou l'autre , cela fonctionne ainsi:
foo['z'] = foo['y'].where(foo['Country']=='Canada',foo['x'])
à un certain point, nous devons mettre en œuvre IfExp pour les requêtes.
OriginalL'auteur EdChum
Ici est une solution générique pour la sélection arbitraire des colonnes de la valeur d'une autre colonne.
Cela a l'avantage de séparer la logique de recherche dans un simple
dict
structure qui le rend facile à modifier.J'étends à une opération où un conditionnel résultat est stocké dans une recherche externe de la structure (
dict
)Boucle de la
pd.DataFrame
pour chaque colonne stockées dans ledict
et utiliser les valeurs dans la table de conditions à déterminer quelle colonne pour sélectionnerPour donner la leçon de vie
A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
une idée sur comment résoudre ce problème?Je ne m'inquiéterais pas. Nous voulons que cela se produise. Vous pouvez vous en débarrasser en ajoutant ‘.copier()’ à la ligne, mais il n'est pas nécessaire
OriginalL'auteur Alexander McFarlane