2014-06-14 16 views
36

Próbuję zrobić coś, co powinno być naprawdę proste w pandach, ale wydaje się, że cokolwiek innego. Próbuję dodać kolumnę do istniejącej ramki danych pandy, która jest zmapowaną wartością na podstawie innej (istniejącej) kolumny. Oto mały sprawdzian:Dodawanie nowej kolumny pandy z mapowaną wartością ze słownika

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) 

Miałem nadzieję dodaje skutkowałoby:

 A B 
0 7001 1 
1 8001 2 
2 9001 3 

Zamiast tego pojawia się błąd informujący mnie, że równoważnik nie jest wymagalne funkcji. Uczciwy, jest to słownik, ale nawet jeśli zawinę to w funkcję, wciąż dostaję frustracji. Więc starałem się użyć funkcji map, który wydaje się działać z innych operacji, ale również został pokonany przez użycie słownika:

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

w tym przypadku po prostu KeyError: 8001. Czytałem poprzez dokumentacji i poprzednie posty, ale nie spotkałem się jeszcze z niczym, co sugerowałoby mieszanie słowników z ramkami danych pandy. Wszelkie sugestie będą bardzo mile widziane.

Odpowiedz

57

Właściwym sposobem wykonania tej czynności będzie 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] 

I będzie poradzić sobie z sytuacją, gdy klucz nie istnieje bardzo ładnie, biorąc pod uwagę następujący przykład:

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

Czy istnieje sposób, aby to zrobić, jeśli dane są łańcuch zamiast int? To daje mi NaNs na ciągi. – griffinc

+0

Nieważne, zobacz odpowiedzi na http://stackoverflow.com/questions/20250771/remap-values-in-pandas-column-with-a-dict – griffinc

Powiązane problemy