2012-04-13 51 views
9

我做错了合并,我不明白它是什么。我已经做了如下估算了一系列的整数值的直方图:熊猫:理解如何合并工作的困难

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

如果我打印histfreq这是我得到:

> 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 

他们都是由"series"索引但如果我尝试合并:

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

我得到KeyError: 'no item named series'异常。如果我省略on = "series",我会得到一个IndexError: list index out of range异常。

我不明白我做错了什么。可能是“系列”是索引而不是列,所以我必须以不同的方式做?

回答

11

docs

上:列(名)加入上。必须在左边和 右边的DataFrame对象中找到。如果没有通过,left_index和right_index 都是假的,在DataFrames列的交叉点会 推断是连接键

我不知道这是为什么没有在文档字符串,但它说明你的问题。

您可以给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 

或者你可以让你的索引中的列,并使用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 

或者更简单地说,DataFrame具有join方法,它不正是你想要什么:

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

改进合并文档字符串的时间! – 2012-04-13 22:23:10

+0

@WesMcKinney:好:) – Avaris 2012-04-13 23:11:16