2016-03-16 21 views
5

Ho passato un po 'di tempo su google e non ho trovato risposta alla semplice domanda: come posso mappare la colonna di dati di Pandas sul posto? Dire, ho il seguente df:colonna mappa Pandas in posizione

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 

e voglio aggiungere 1 ad ogni valore di b colonna. So che posso farlo così:

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

O come che - per quanto ne so non c'è differenza tra map e apply nel contesto Series (tranne che map può anche accettare dict o Series) - correggimi se sbaglio:

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

Ma non mi piace che specifica 'b' due volte. Invece, vorrei fare qualcosa del genere:

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

È possibile?

+2

Se si seleziona [ 'map'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html) - no, non è possibile. – jezrael

risposta

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 

Modifica per aggiungere:

Se questa è una funzione arbitraria, e si ha realmente bisogno di applicare al suo posto, è possibile scrivere un sottile wrapper panda di gestirlo. Personalmente non riesco a immaginare un momento in cui sarebbe fondamentale che non si debba usare l'implementazione standard (a meno che forse non si scriva una tonnellata di codice e non si possa preoccupare di scrivere forse i caratteri extra ??)

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 

Dà:

>> 
       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 

Ovviamente questo è un esempio molto minimale, si spera che espone alcuni metodi di interesse per voi.

+3

Bene, +1 era solo un esempio. Come scriverai qualche funzione personalizzata in questo modo? – ars

+0

Ah, non è stato specificato. È sorprendentemente comune che le persone utilizzino apply per aggiungere 1 a un df. Modificherò. – Chris

+0

Ok, ora sono sicuro che non esiste alcuna funzione di libreria per questo. – ars

0

È possibile utilizzare 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

Come ho detto nel commento ad un'altra risposta, + 1 era solo un esempio; Vorrei mappare la colonna con una funzione arbitraria. – ars

Problemi correlati