2017-10-16 12 views
0

J'ai un dict de pays et de la population:Pourquoi suis-je une série dans une apply/affecter la fonction dans Pandas

population_dict = {"Germany": 1111, .... } 

Dans mon df (sort_countries) J'ai une colonne appelée pays et je veux ajouter une autre colonne appelée population du dictionnaire ci-dessus (pays correspondant à la population)

population_df = sort_countries.assign(
    population=lambda x: population_dict[x["country"]], axis = 1) 
population_df.head() 

qui donne l'erreur: TypeError: 'Series' objects are mutable, thus they cannot be hashed.

Pourquoi est x["country"] une série quand j'imagine qu'il devrait retourner juste le nom du pays. Ce petit bout de pandas me rend toujours confus. Dans mes lambdas, je m'attendrais à ce que x soit une rangée et je sélectionne simplement le pays de cette rangée. Au lieu de len (x ["country"]) me donne 192 (le nombre de mes pays, la série entière). Comment puis-je les faire correspondre en utilisant lambdas et pas une fonction distincte d'autre? Merci!

Répondre

1

Notez que x["country"] est un Series, bien que ce soit un élément unique, cela ne peut pas être utilisé pour indexer le dictionnaire. Si vous voulez juste la valeur associée, utilisez x["country"].item().

Cependant, une meilleure mesure d'approche fait pour ce genre de chose utilise df.map:

population_df["population"] = population_df["country"].map(population_dict) 

map assignera automatiquement les clés prises de population_df [ « pays »] et les associer à leurs valeurs appropriées dans population_dict.

+0

la carte fonctionne parfaitement. Mais le .item() ne le fait pas. Je crois que x ["country"] est une série avec toute la colonne. Je ne comprends pas pourquoi. J'ai juste besoin de cette rangée spécifique ... –