2013-03-16 48 views
2

我有一個擁有數千行和4列的熊貓數據框。即:在Python中計算與熊貓一行的發生率

A B C D 
1 1 2 0 
3 3 2 1 
3 1 1 0 
.... 

有什麼方法可以計算某一行發生多少次?例如,可以找到多少次[3,1,1,0],並返回這些行的索引?

+0

有很多這樣做,包括如何最明顯的一個微不足道的線性搜索 - 如此微不足道,我懷疑沒有人會問這裏。我懷疑這不是你正在尋找的東西?這是關於在一般情況下找到重複的更多嗎? – marko 2013-03-16 18:52:10

回答

4

如果你只想找一個行的話,我可能會做這樣的事情

>>> df.index[(df == [3, 1, 1, 0]).all(axis=1)] 
Int64Index([2, 3], dtype=int64) 

-

說明如下。從開始:

>>> df 
    A B C D 
0 1 1 2 0 
1 3 3 2 1 
2 3 1 1 0 
3 3 1 1 0 
4 3 3 2 1 
5 1 2 3 4 

我們比較反對我們的目標:

>>> df == [3,1,1,0] 
     A  B  C  D 
0 False True False True 
1 True False False False 
2 True True True True 
3 True True True True 
4 True False False False 
5 False False False False 

找出那些該比賽:

>>> (df == [3,1,1,0]).all(axis=1) 
0 False 
1 False 
2  True 
3  True 
4 False 
5 False 

,並使用此布爾系列從索引中選擇:

>>> df.index[(df == [3,1,1,0]).all(axis=1)] 
Int64Index([2, 3], dtype=int64) 

如果你是不計算一行的出現次數,而是您想要爲每一行重複執行此操作,因此您確實想要同時查找所有行,但比反覆執行上述操作要快得多。但是這應該足夠工作一行。

+0

感謝您的回答帝斯曼。我試過了,看起來是我需要的。但是,我的初始數據框有1000萬行,df.index結果似乎只在前100000行中顯示匹配。有什麼我可以做,讓它通過整個數據集? – MA81 2013-03-17 00:19:52

+0

對不起,它現在工作!完美,這是我所需要的。非常感謝! – MA81 2013-03-17 00:22:07

1

首先創建一個樣本數組:

>>> import numpy as np 
>>> x = [[1, 1, 2, 0], 
... [3, 3, 2, 1], 
... [3, 1, 1, 0], 
... [0, 1, 2, 3], 
... [3, 1, 1, 0]] 

然後創建數組,其中每行是一個單一元素的觀點:

>>> y = x.view([('', x.dtype)] * x.shape[1]) 
>>> y 
array([[(1, 1, 2, 0)], 
     [(3, 3, 2, 1)], 
     [(3, 1, 1, 0)], 
     [(0, 1, 2, 3)], 
     [(3, 1, 1, 0)]], 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')]) 

與你想要找的元素同樣的事情:

>>> e = np.array([[3, 1, 1, 0]]) 
>>> tofind = e.view([('', e.dtype)] * e.shape[1]) 

現在你可以查找元素:

>>> y == tofind[0] 
array([[False], 
     [False], 
     [ True], 
     [False], 
     [ True]], dtype=bool) 
1

您也可以使用多指標,當它的排序,這是更快地找到計數:

s = StringIO("""A B C D 
1 1 2 0 
3 3 2 1 
3 1 1 0 
3 1 1 0 
3 3 2 1 
1 2 3 4""") 
df = pd.read_table(s,delim_whitespace=True) 
s = pd.Series(range(len(df)), index=pd.MultiIndex.from_arrays(df.values.T)) 
s = s.sort_index() 
idx = s[3,1,1,0] 
print idx.count(), idx.values 

輸出:

2 [2 3]