2013-04-02 13 views
7

Non riesco a trovare la voce sul metodo dot()in the official documentation. Comunque il metodo è lì e posso usarlo. Perchè è questo?Ottieni il prodotto punto del dataframe con il vettore e restituisci il frame dati, in Pandas

Su questo argomento, c'è un modo per calcolare una moltiplicazione elemento-saggio di ogni riga in un frame di dati con un altro vettore? (e ottenere un dataframe indietro?), cioè simile a dot() ma piuttosto che calcolare il prodotto dot, si calcola il prodotto element-wise.

+0

È possibile pubblicare questo come [un problema su github] (https://github.com/pydata/pandas/issues). Se esegui il checkout della docstring sul punto, ti dice cosa fa (se stai usando ipython usa 'df.dot?'). –

risposta

8

Ecco un esempio di come moltiplicare un dataframe da un vettore:

In [60]: df = pd.DataFrame({'A': [1., 1., 1., 2., 2., 2.], 'B': np.arange(1., 7.)}) 

In [61]: vector = np.array([2,2,2,3,3,3]) 

In [62]: df.mul(vector, axis=0) 
Out[62]: 
    A B 
0 2 2 
1 2 4 
2 2 6 
3 6 12 
4 6 15 
5 6 18 
+0

Grazie !. Sai perché 'dot()' non fa parte del documento ufficiale? –

+2

Ci sono due metodi 'punto' in Panda. 'Series.dot' è ereditato da' ndarray.dot', dato che 'Series' è una sottoclasse di' ndarray 'di NumPy. Puoi trovare la documentazione per questo [qui] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html). Per quanto riguarda 'DataFrame.dot', la mia ipotesi è che semplicemente non sono riusciti a documentarlo. (È un comportamento abbastanza comprensibile sbirciando la sua definizione in 'pandas/core/frame.py' comunque.) – unutbu

+1

Aggiornamento:' pandas.Series' non è più una sottoclasse di 'ndarray', ma ha ancora un [' punto 'metodo] (http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.Series.dot.html). – unutbu

1

È piuttosto difficile da dire con un certo grado di precisione.

Spesso esiste un metodo non documentato perché è considerato interno dal fornitore e potrebbe essere soggetto a modifiche.

Potrebbe, ovviamente, essere una semplice svista delle persone che hanno messo insieme la documentazione.

Per quanto riguarda la seconda domanda; Non lo so davvero, ma potrebbe essere meglio fare una nuova domanda di S/O per questo. Basta eseguire la scansione dell'API, potresti fare qualcosa con la funzione .applymap (funzione) di DataFrame?

6

Moltiplicare sta facendo essenzialmente un esterno prodotto. Dot è un prodotto interno, se la mia memoria algebra lineare è corretta. Lasciate che vi spieghi sulla risposta accettata:

In [13]: df = pd.DataFrame({'A': [1., 1., 1., 2., 2., 2.], 'B': np.arange(1., 7.)}) 

In [14]: v1 = np.array([2,2,2,3,3,3]) 

In [15]: v2 = np.array([2,3]) 

In [16]: df.shape 
Out[16]: (6, 2) 

In [17]: v1.shape 
Out[17]: (6,) 

In [18]: v2.shape 
Out[18]: (2,) 

In [24]: df.mul(v2) 
Out[24]: 
    A B 
0 2 3 
1 2 6 
2 2 9 
3 4 12 
4 4 15 
5 4 18 

In [26]: df.dot(v2) 
Out[26]: 
0  5 
1  8 
2 11 
3 16 
4 19 
5 22 
dtype: float64 

Quindi:

df.mul prende matrice di forma (6,2) e vettoriale (6, 1) e restituisce la forma matrice (6,2)

Mentre:

df.dot prende la matrice di forma (6,2) e vettore (2,1) e restituisce (6,1).

Queste non sono la stessa operazione, sono (penso) i prodotti esterni e interni, rispettivamente.

+1

Grazie, ho trovato questa la risposta più utile qui. Meglio anche del documento panda. – smci

Problemi correlati