2013-10-24 22 views
5

Dire che ho due serie in panda, serie A e serie B. Come faccio a creare un dataframe in cui tutti questi valori sono moltiplicati insieme, cioè con la serie A in basso a sinistra lato mano e serie B lungo la parte superiore. Fondamentalmente lo stesso concetto come questo, dove serie A sarebbe il giallo sulla sinistra e serie B giallo lungo la parte superiore, e tutti i valori intermedi verrebbe compilato da moltiplicazione:Creazione di un dataframe in panda moltiplicando due serie insieme

http://www.google.co.uk/imgres?imgurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables/times-table-12x12.gif&imgrefurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables.htm&h=533&w=720&sz=58&tbnid=9B8R_kpUloA4NM:&tbnh=90&tbnw=122&zoom=1&usg=__meqZT9kIAMJ5b8BenRzF0l-CUqY=&docid=j9BT8tUCNtg--M&sa=X&ei=bkBpUpOWOI2p0AWYnIHwBQ&ved=0CE0Q9QEwBg

Purtroppo, dovrebbe probabilmente aver aggiunto che le mie due serie non hanno la stessa lunghezza. Sto ricevendo un errore ora che "le matrici non sono allineate" quindi presumo che sia questo il problema.

+0

Che cosa hai provato fino ad ora? Puoi modificare la tua domanda e aggiungere codice, errori o risultati. – Theresa

risposta

2

È possibile utilizzare a matrice di punti moltiplicazione, ma prima è necessario convertire Series per dataframe (perché dot method on Series implements dot product):

>>> B = pd.Series(range(1, 5)) 
>>> A = pd.Series(range(1, 5)) 
>>> dfA = pd.DataFrame(A) 
>>> dfB = pd.DataFrame(B) 
>>> dfA.dot(dfB.T) 
    0 1 2 3 
0 1 2 3 4 
1 2 4 6 8 
2 3 6 9 12 
3 4 8 12 16 
0

Quindi penso che questo può ottenere la maggior parte del modo in cui ci se si dispone di due serie di diverse lunghezze Sembra una procedura molto manuale, ma non riesco a pensare a un altro modo utilizzando le funzioni panda o NumPy.

>>>> a = Series([1, 3, 3, 5, 5]) 
>>>> b = Series([5, 10]) 

prima convertire la riga valori a ad un dataframe e fare copie di questa serie in forma di nuovi colonne come molti come avete valori nei vostri colonne serie b.

>>>> result = DataFrame(a) 
>>>> for i in xrange(len(b)): 
      result[i] = a 
    0 1 
0 1 1 
1 3 3 
2 3 3 
3 5 5 
4 5 5 

È quindi possibile trasmettere il tuo Series b sopra la dataframe result:

>>>> result = result.mul(b) 
    0 1 
0 5 10 
1 15 30 
2 15 30 
3 25 50 
4 25 50 

Nell'esempio ho scelto, vi ritroverete con gli indici che sono duplicati a causa della vostra prima serie. Consiglierei di lasciare gli indici come identificatori univoci. Ciò ha senso a livello di codice, altrimenti restituirai più di un valore quando selezioni un indice a cui è assegnata più di una riga. Se è necessario, si può quindi reindicizzare le etichette di riga e le etichette delle colonne utilizzando queste funzioni:

>>>> result.columns = b 
>>>> result.set_index(a) 
    5 10 
1 5 10 
3 15 30 
3 15 30 
5 25 50 
5 25 50 

Esempio di indicizzazione duplicato:

>>>> result.loc[3] 
    5 10 
3 15 30 
3 15 30 
1

Innanzitutto creare una dataframe di 1 di. Quindi trasmettere moltiplicare lungo ogni asse a turno.

>>> s1 = Series([1,2,3,4,5]) 
>>> s2 = Series([10,20,30]) 
>>> df = DataFrame(1, index=s1.index, columns=s2.index) 
>>> df 
    0 1 2 
0 1 1 1 
1 1 1 1 
2 1 1 1 
3 1 1 1 
4 1 1 1 
>>>> df.multiply(s1, axis='index') * s2 
    0 1 2 
0 10 20 30 
1 20 40 60 
2 30 60 90 
3 40 80 120 
4 50 100 150 

è necessario utilizzare df.multiply al fine di specificare che la serie sarà allineato con l'indice di riga. È possibile utilizzare l'operatore di moltiplicazione normale * con s2 perché la corrispondenza su colonne è il modo predefinito di eseguire la moltiplicazione tra un DataFrame e una Serie.

2

È possibile creare un DataFrame moltiplicando due serie di lunghezza non uguale trasmettendo ciascun valore della riga (o colonna) con le altre serie. Ad esempio:

> row = pd.Series(np.arange(1, 6), index=np.arange(1, 6)) 
> col = pd.Series(np.arange(1, 4), index=np.arange(1, 4)) 
> row.apply(lambda r: r * col) 
    1 2 3 
1 1 2 3 
2 2 4 6 
3 3 6 9 
4 4 8 12 
5 5 10 15 
Problemi correlati