2015-04-16 41 views
2

我對Pandas非常陌生,但我一直在閱讀它,以及在處理大數據時速度如何。使用熊貓數據框的最有效方式

我設法創建一個數據幀,而我現在有一個熊貓數據幀,看起來是這樣的:

0  1 
0 1 14 
1 2 -1 
2 3 1817 
3 3 29 
4 3 25 
5 3  2 
6 3  1 
7 3 -1 
8 4 25 
9 4 24 
10 4  2 
11 4 -1 
12 4 -1 
13 5 25 
14 5  1 

列0是作者的id和列1是筆者對出版物的引用數量(-1表示零引用)。每行代表作者的不同出版物。

我試圖計算每個作者的h指數。 h指數定義爲作者所引用的h次出版物的數量至少爲h次。因此,對於作者:

作者1具有1名

作者2 h指數具有0

作者3 h指數具有3

作者4 h指數具有h指數2

筆者5具有1

h指數這是這樣我目前做的,它涉及到很多循環的:

current_author=1 
hindex=0 

for index, row in df.iterrows(): 
    if row[0]==current_author: 
     if row[1]>hindex: 
      hindex+=1 
    else: 
     print "author ",current_author," has h-index:", hindex 
     current_author+=1 
     hindex=0 
     if row[1]>hindex: 
      hindex+=1 

print "author ",current_author," has h-index:", hindex 

我的實際數據庫中有超過300萬位作者。如果我循環每一個這將需要幾天計算。我試圖找出你認爲是解決這個問題的最快方法?

提前致謝!

回答

2

我在這裏將您的列重命名爲'author'和'citations',我們可以將作者groupby然後應用一個lambda,這裏lambda比較引用數量和值,這會生成1或0 if如此,我們就可以總結如下:

In [104]: 

df['h-index'] = df.groupby('author')['citations'].transform(lambda x: (x >= x.count()).sum()) 
​ 
df 
Out[104]: 
    author citations h-index 
0  1   14  1 
1  2   -1  0 
2  3  1817  3 
3  3   29  3 
4  3   25  3 
5  3   2  3 
6  3   1  3 
7  3   -1  3 
8  4   25  2 
9  4   24  2 
10  4   2  2 
11  4   -1  2 
12  4   -1  2 
13  5   25  1 
14  5   1  1 

編輯正如@Julien Spronck指出,上述如果正確作者4他們引文3,3,3不起作用。通常情況下,你不能訪問間工作組指標,但我們可以比較反對rank引文價值,這是一個僞索引,但如果引用值是唯一的它僅適用:

In [129]: 

df['h-index'] = df.groupby('author')['citations'].transform(lambda x: (x >= x.rank(ascending=False, method='first')).sum()) 
​ 
df 
Out[129]: 
    author citations h-index 
0  1   14  1 
1  2   -1  0 
2  3  1817  3 
3  3   29  3 
4  3   25  3 
5  3   2  3 
6  3   1  3 
7  3   -1  3 
8  4   25  2 
9  4   24  2 
10  4   2  2 
11  4   -1  2 
12  4   -1  2 
13  5   25  1 
14  5   1  1 
+0

它的工作原理!和美麗!謝謝埃德:)))))) – BKS

+0

@BKS我不認爲這個解決方案是正確的......如果作者3的三個第一條目等於3(而不是1817,29,25),h指數仍然是3,而這段代碼會給0。我認爲我的代碼在下面(儘管不那麼優雅)在這種情況下給出了正確的答案。 –

+0

@JulienSpronck是的,我認爲你是對的我只需要改''''''=' – EdChum

2

我不知道這是否是速度夠快,但這是一個適合你的解決方案。在此代碼中,我首先按作者對數據框進行排序,然後通過減少引用編號進行排序。我爲每位作者添加一個新的索引,該索引對應於紙張編號。我通過將紙張編號與引文編號進行比較來創建另一列。所有剩下的工作就是總結每個作者的最後一列。

import numpy as np 

df2 = df.sort([0,1],ascending=[1,0]) 
groups = df2.groupby(0) 
ind2 = np.array([np.arange(len(g))+1 for g in groups.groups.itervalues()]) 
df2['newindex'] = np.hstack(ind2) 
df2['condition'] = df2[1]>=df2['newindex'] 
hindex = df2.groupby(0).sum()['condition'] 

## 0 
## 1 1 
## 2 0 
## 3 3 
## 4 2 
## 5 1 
+0

我試着運行它。 hindex僅返回填充了True的數據幀。此外,與-1應該被考慮,因爲他們有一個hindex爲0. – BKS

+0

好吧,我對它:-) –

+0

謝謝朱利安。我上面的代碼實際上工作,邏輯是正確的(不知道這是否有幫助)。我只是覺得它非常慢,我沒有真正利用熊貓,因爲我應該。 – BKS

相關問題