2012-04-13 14 views
9

Sto facendo qualcosa di sbagliato con l'unione e non riesco a capire di cosa si tratta. Ho fatto quanto segue per stimare un istogramma di una serie di valori interi:Panda: problemi a capire come funziona l'unione

import pandas as pnd 
import numpy as np 

series = pnd.Series(np.random.poisson(5, size = 100)) 
tmp = {"series" : series, "count" : np.ones(len(series))} 
hist = pnd.DataFrame(tmp).groupby("series").sum() 
freq = (hist/hist.sum()).rename(columns = {"count" : "freq"}) 

se stampo hist e freq questo è quello che ottengo:

> print hist 
     count 
series  
0   2 
1   4 
2   13 
3   15 
4   12 
5   16 
6   18 
7   7 
8   8 
9   3 
10   1 
11   1 

> print freq 
     freq 
series  
0  0.02 
1  0.04 
2  0.13 
3  0.15 
4  0.12 
5  0.16 
6  0.18 
7  0.07 
8  0.08 
9  0.03 
10  0.01 
11  0.01 

Sono entrambi indicizzato da "series" ma se provo a fondersi:

> df = pnd.merge(freq, hist, on = "series") 

ottengo un'eccezione KeyError: 'no item named series'. Se ometto lo on = "series", ricevo un'eccezione IndexError: list index out of range.

Non capisco cosa sto facendo male. Può essere "serie" è un indice e non una colonna quindi devo farlo in modo diverso?

risposta

11

Da docs:

on: colonne (nomi) di aderire su. Deve essere trovato in entrambi gli oggetti DataFrame a destra e . Se non passato e left_index e right_index sono false, l'intersezione delle colonne nelle DataFrames sarà dedotto di essere il join chiavi

Non so perché questo non è nella docstring, ma spiega il tuo problema.

È possibile dare left_index e right_index:

In : pnd.merge(freq, hist, right_index=True, left_index=True) 
Out: 
     freq count 
series 
0  0.01  1 
1  0.04  4 
2  0.14  14 
3  0.12  12 
4  0.21  21 
5  0.14  14 
6  0.17  17 
7  0.07  7 
8  0.05  5 
9  0.01  1 
10  0.01  1 
11  0.03  3 

Oppure si può fare il vostro indice di una colonna e utilizzare on:

In : freq2 = freq.reset_index() 

In : hist2 = hist.reset_index() 

In : pnd.merge(freq2, hist2, on='series') 
Out: 
    series freq count 
0  0 0.01  1 
1  1 0.04  4 
2  2 0.14  14 
3  3 0.12  12 
4  4 0.21  21 
5  5 0.14  14 
6  6 0.17  17 
7  7 0.07  7 
8  8 0.05  5 
9  9 0.01  1 
10  10 0.01  1 
11  11 0.03  3 

alternativa e più semplicemente, DataFrame ha join metodo che fa esattamente quello che vuoi:

In : freq.join(hist) 
Out: 
     freq count 
series 
0  0.01  1 
1  0.04  4 
2  0.14  14 
3  0.12  12 
4  0.21  21 
5  0.14  14 
6  0.17  17 
7  0.07  7 
8  0.05  5 
9  0.01  1 
10  0.01  1 
11  0.03  3 
+1

È ora di migliorare la docenza di unione! –

+0

@WesMcKinney: Bello :) – Avaris