2014-12-03 15 views
5

ho due dataframes (Serie realtà) generato da un'operazione di groupby:panda si fondono su indice non funziona

bw

l1 
Consumer Discretionary   0.118718 
Consumer Staples    0.089850 
Energy       0.109988 
Financials      0.159418 
Health Care     0.115060 
Industrials     0.109078 
Information Technology   0.200392 
Materials      0.035509 
Telecommunications Services 0.030796 
Utilities      0.031190 
dtype: float64 

e pw

l1 
Consumer Discretionary   0.148655 
Consumer Staples    0.067873 
Energy       0.063899 
Financials      0.095689 
Health Care     0.116015 
Industrials     0.181346 
Information Technology   0.117715 
Materials      0.043155 
Telecommunications Services 0.009550 
Utilities      0.156103 
dtype: float64 

Quando provo e li merge using

pd.merge(bw,pw,left_index=True,right_index=True)

ottengo un errore

Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2883, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-174-739bb362e06d>", line 1, in <module> 
    pd.merge(pw,attr,left_index=True,right_index=True) 
    File "/usr/lib/python2.7/dist-packages/pandas/tools/merge.py", line 39, in merge 
    return op.get_result() 
    File "/usr/lib/python2.7/dist-packages/pandas/tools/merge.py", line 185, in get_result 
    join_index, left_indexer, right_indexer = self._get_join_info() 
    File "/usr/lib/python2.7/dist-packages/pandas/tools/merge.py", line 251, in _get_join_info 
    left_ax = self.left._data.axes[self.axis] 
IndexError: list index out of range 

ma quando lo faccio

bw = bw.reset_index() 
pw = pw.reset_index() 
mrg = pd.merge(pw,bw,on="l1") 

funziona. Rende il mio codice molto meno leggibile su più iterazioni di join, tuttavia mi piacerebbe sapere cosa sto facendo male e come posso ottenere la prima versione del codice merging on indexes per funzionare.

Grazie

+1

È interessante, mi sembra soddisfacente. Quale versione di panda stai usando? Inoltre, puoi provare dataframe.join() ... bw.join (pw) –

+0

Ciao @BobHaffner è il panda nel repository di ubuntu che penso sia 0.14.1. bw.join (pw) dà un errore 'AttributeError: l'oggetto 'Series' non ha attributo 'join'', motivo per cui stavo scendendo il percorso di fusione ... –

+1

Ok, spara. Avevo dimenticato che il join era una cosa solo per df –

risposta

8

cambiate le serie in dataframe allora è possibile unire

merged = pd.merge(pd.DataFrame(bw),pd.DataFrame(pw),left_index=True,right_index=True) 
print(merged) 

Il risultato:

        0_x  0_y 
l1            
Consumer Discretionary  0.118718 0.118718 
Consumer Staples    0.089850 0.089850 
Energy      0.109988 0.109988 
Financials     0.159418 0.159418 
Health Care     0.115060 0.115060 
Industrials     0.109078 0.109078 
Information Technology  0.200392 0.200392 
Materials     0.035509 0.222509 
Telecommunications Services 0.030796 0.030796 
Utilities     0.031190 0.031190 

Oppure, se l'unione deve essere eseguita in modo parallelo (bw e pw hanno lo stesso indice, lo stesso numero di elementi).

c = zip(bw.tolist(),pw.tolist()) 
merged = pd.DataFrame(c, index=bw.index) 

dovrebbe avere lo stesso risultato.

Quando si esegue il numero reset_index() una serie, si trasforma in DataFrame (indice in colonna). Ecco perché puoi unirti dopo.