2012-04-13 23 views
9

Tôi đang làm điều gì đó sai trái khi hợp nhất và tôi không thể hiểu nó là gì. Tôi đã thực hiện những điều sau đây để ước lượng một biểu đồ của một loạt các giá trị số nguyên:Pandas: gặp khó khăn khi hiểu cách hợp nhất hoạt động

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

Nếu tôi in histfreq đây là những gì tôi nhận được:

> 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 

Họ đang cả hai lập chỉ mục bởi "series" nhưng nếu tôi cố gắng hợp nhất:

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

Tôi nhận được một ngoại lệ KeyError: 'no item named series'. Nếu tôi bỏ qua on = "series" Tôi nhận được một ngoại lệ IndexError: list index out of range.

Tôi không hiểu mình đang làm gì sai. Có thể là "chuỗi" là một chỉ mục chứ không phải một cột vì vậy tôi phải làm điều đó một cách khác nhau?

Trả lời

11

Từ docs:

trên: Cột (tên) tham gia vào. Phải được tìm thấy ở cả bên trái và đối tượng DataFrame phù hợp. Nếu không được thông qua và left_index và right_index là False, giao điểm của các cột trong DataFrames sẽ suy ra là tham gia khóa

Tôi không biết tại sao điều này không có trong docstring, nhưng nó giải thích vấn đề của bạn.

Bạn có thể cung cấp cho left_indexright_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 

Hoặc bạn có thể làm chỉ số của bạn một cột và sử dụng 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 

Ngoài và đơn giản hơn, DataFramejoin phương pháp mà thực hiện chính xác những gì bạn muốn:

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

Thời gian để cải thiện chuỗi kết hợp! –

+0

@WesMcKinney: Nice :) – Avaris

Các vấn đề liên quan