2014-06-14 13 views
36

Sto provando a fare qualcosa che dovrebbe essere davvero semplice nei panda, ma sembra tutt'altro. Sto cercando di aggiungere una colonna a un dataframe panda esistente che è un valore mappato basato su un'altra colonna (esistente). Ecco un piccolo banco di prova:Aggiunta di una nuova colonna panda con valore mappato da un dizionario

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001]}) 
df["B"] = equiv(df["A"]) 
print(df) 

Speravo quanto segue comporterebbe:

 A B 
0 7001 1 
1 8001 2 
2 9001 3 

Invece, ottengo un errore che mi diceva che equiv non è una funzione callable. Giusto, è un dizionario, ma anche se lo avvolgo in una funzione continuo a provare frustrazione. Così ho cercato di usare una funzione di mappa che sembra funzionare con altre operazioni, ma anche viene sconfitto con l'uso di un dizionario:

df["B"] = df["A"].map(lambda x:equiv[x]) 

In questo caso ottengo solo KeyError: 8001. Ho letto attraverso la documentazione e post precedenti, ma devono ancora imbattersi in tutto ciò che suggerisce come mescolare i dizionari con i datafram panda. Ogni suggerimento sarà molto apprezzato.

risposta

57

Il modo corretto per farlo è df["B"] = df["A"].map(equiv).

In [55]: 

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001]}) 
df["B"] = df["A"].map(equiv) 
print(df) 
     A B 
0 7001 1 
1 8001 2 
2 9001 3 

[3 rows x 2 columns] 

E sarà gestire la situazione quando la chiave non esiste molto bene, considerando il seguente esempio:

In [56]: 

import pandas as pd 
equiv = {7001:1, 8001:2, 9001:3} 
df = pd.DataFrame({"A": [7001, 8001, 9001, 10000]}) 
df["B"] = df["A"].map(equiv) 
print(df) 
     A B 
0 7001 1 
1 8001 2 
2 9001 3 
3 10000 NaN 

[4 rows x 2 columns] 
+1

C'è un modo per farlo se i dati sono stringa invece di int? Questo mi dà solo NaNs per archi. – griffinc

+0

Non importa, vedi le risposte qui http://stackoverflow.com/questions/20250771/remap-values-in-pandas-column-with-a-dict – griffinc

Problemi correlati