2012-04-13 42 views
9

Robię coś nie tak z scalaniem i nie mogę zrozumieć, co to jest. Zrobiłem następujące oszacowanie histogram szeregu wartości:Pandy: trudno zrozumieć, jak działa scalanie

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

Gdybym wydrukować hist i freq to, co mam:

> 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 

Oni zarówno indeksowane przez "series" ale jeśli próbuję scalić:

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

Otrzymuję wyjątek KeyError: 'no item named series'. Jeśli pominę on = "series", otrzymam wyjątek IndexError: list index out of range.

Nie rozumiem, co robię źle. Może być "seria" to indeks, a nie kolumna, więc muszę zrobić to inaczej?

Odpowiedz

11

Od docs:

na: Kolumny (nazwami) do przyłączenia się dalej. Musi być znaleziony w obu obiektach DataFrame w prawej i . Jeśli nie minęło i left_index i right_index są False, skrzyżowanie z kolumn w DataFrames będzie wywnioskować być dołączyć klucze

Nie wiem, dlaczego to nie jest w docstring, ale to wyjaśnia Twój problem.

Można też dać left_index i 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 

Albo można zrobić indeks kolumny i używać 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 

Alternatywnie i prościej, DataFrame ma join metodę, która robi dokładnie co chcesz:

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

Czas poprawić docsowanie merge! –

+0

@WesMcKinney: Nice :) – Avaris