2015-04-16 40 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

相关问题