2012-04-13 13 views
9

Estoy haciendo algo mal con la fusión y no puedo entender de qué se trata. He hecho lo siguiente para calcular un histograma de una serie de valores enteros:Pandas: problemas para entender cómo funciona la fusión

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"}) 

Si imprimo hist y freq esto es lo que me sale:

> 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 

Ambos están indexados por "series" pero si trato de combinar:

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

recibo una excepción KeyError: 'no item named series'. Si omito on = "series" obtengo una excepción de IndexError: list index out of range.

No entiendo lo que estoy haciendo mal. ¿Puede ser "serie" es un índice y no una columna, así que debo hacerlo de manera diferente?

Respuesta

11

De docs:

en: Columnas (nombres) para unirse sucesivamente. Debe encontrarse tanto en el lado izquierdo como en el objetos RightFrame. Si no se pasa y left_index y right_index son falsas, la intersección de las columnas de las tramas de datos será infiere que las teclas se unen

No sé por qué esto no está en la cadena de documentación, pero se explica tu problema.

Usted puede dar left_index y 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 

O bien, puede hacer que su índice de una columna y utilizar 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 y más simplemente, DataFrame tiene join método que hace exactamente lo que quiere:

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

¡Hora de mejorar el docstring de fusión! –

+0

@WesMcKinney: Nice :) – Avaris

Cuestiones relacionadas