2016-03-16 13 views
5

Spędziłem trochę czasu na wyszukiwaniu i nie znalazłem odpowiedzi na proste pytanie: w jaki sposób mogę odwzorować kolumnę Pandas na miejscu? Powiedz, mam następujący DF:Kolumna mapy Pandy na miejscu

In [67]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) 

In [68]: frame 
Out[68]: 
       b   d   e 
Utah -1.240032 1.586191 -1.272617 
Ohio -0.161516 -2.169133 0.223268 
Texas -1.921675 0.246167 -0.744242 
Oregon 0.371843 2.346133 2.083234 

I chcę dodać 1 do każdej wartości b kolumnie. Wiem, że mogę to zrobić tak:

In [69]: frame['b'] = frame['b'].map(lambda x: x + 1) 

Albo tak - AFAIK nie ma różnicy między map i apply w kontekście Series (z wyjątkiem map może również przyjąć dict lub Series) - poprawcie mnie jeśli się mylę:

In [71]: frame['b'] = frame['b'].apply(lambda x: x + 1) 

Ale nie podoba mi się określenie 'b' dwukrotnie. Zamiast tego chciałbym zrobić coś takiego:

frame['b'].map(lambda x: x + 1, inplace=True) 

Czy to możliwe?

+2

Jeśli zaznaczysz [ 'map'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html) - nie, nie jest to możliwe. – jezrael

Odpowiedz

6
frame 
Out[6]: 
       b   d   e 
Utah -0.764764 0.663018 -1.806592 
Ohio 0.082226 -0.164653 -0.744252 
Texas 0.763119 1.492637 -1.434447 
Oregon -0.485245 -0.806335 -0.008397 

frame['b'] +=1 

frame 
Out[8]: 
       b   d   e  
Utah 0.235236 0.663018 -1.806592 
Ohio 1.082226 -0.164653 -0.744252 
Texas 1.763119 1.492637 -1.434447 
Oregon 0.514755 -0.806335 -0.008397 

Edycja dodać:

Jeśli ta funkcja jest arbitralne i naprawdę trzeba zastosować w miejscu, można napisać cienką otoki wokół pandy go obsłużyć. Osobiście nie potrafię sobie wyobrazić czasu, w którym byłoby tak ważne, aby nie używać standardowej implementacji (chyba, że ​​napisałeś tonę kodu i nie można zawracać sobie głowy pisaniem dodatkowych charectersów?)

from pandas import DataFrame 
import numpy as np 

class MyWrapper(DataFrame): 
    def __init__(self, *args, **kwargs): 
     super(MyWrapper,self).__init__(*args,**kwargs) 

    def myapply(self,label, func): 
     self[label]= super(MyWrapper,self).__getitem__(label).apply(func) 


df = frame = MyWrapper(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) 
print df 
df.myapply('b', lambda x: x+1) 
print df 

daje:

>> 
       b   d   e 
Utah -0.260549 -0.981025 1.136154 
Ohio 0.073732 -0.895937 -0.025134 
Texas 0.555507 -1.173679 0.946342 
Oregon 1.871728 -0.850992 1.135784 
       b   d   e 
Utah 0.739451 -0.981025 1.136154 
Ohio 1.073732 -0.895937 -0.025134 
Texas 1.555507 -1.173679 0.946342 
Oregon 2.871728 -0.850992 1.135784 

Oczywiście jest to bardzo minimalny przykład, z nadzieją, która eksponuje kilka metod zainteresuje.

+3

Cóż, +1 to tylko przykład. Jak w ten sposób napiszesz dowolną funkcję niestandardową? – ars

+0

Ah, to nie zostało określone. Zaskakująco często ludzie używają do dodawania 1 do df. Będę edytować. – Chris

+0

Ok, teraz mam pewność, że nie ma funkcji biblioteki do tego. – ars

0

Można użyć add

In [2]: import pandas as pd 

In [3]: import numpy as np 

In [4]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index= 
    ...: ['Utah', 'Ohio', 'Texas', 'Oregon']) 

In [5]: frame.head() 
Out[5]: 
       b   d   e 
Utah -1.165332 -0.999244 -0.541742 
Ohio -0.319887 0.199094 -0.438669 
Texas -1.242524 -0.385092 -0.389616 
Oregon 0.331593 0.505496 1.688962 

In [6]: frame.b.add(1) 
Out[6]: 
Utah  -0.165332 
Ohio  0.680113 
Texas -0.242524 
Oregon 1.331593 
Name: b, dtype: float64 

In [7]: 
+1

Jak już powiedziałem w komentarzu do innej odpowiedzi, + 1 był tylko przykładem; Chciałbym odwzorować kolumnę z dowolną funkcją. – ars

Powiązane problemy