2013-10-02 124 views
1

我需要跟踪指定列的每个位置。所以如果第一列有相同的名字k次,它的值就是1 * k。它在一个示例中最佳示出的:熊猫数据框 - 基于索引位置的计数值

df1 = pd.DataFrame({'name':['n1', 'n2', 'n3']}) 
df1['pos'] = df1.index + 1 

df2 = pd.DataFrame({'name':['n1', 'n3', 'n4']}) 
df2['pos'] = df2.index + 1 

print "df1:\n", df1, '\n' 
print "df2:\n", df2, '\n' 

# Hack 
df3 = df1.merge(df2, on='name', how='outer') 
df3 = df3.fillna(0) 
print df3 

# Sum the desired values 
df3['pos'] = df3.pos_x + df3.pos_y 
del df3['pos_x'] 
del df3['pos_y'] 

# Produce desired output 
print "\nDesired Output:\n", df3 

的输出是:

df1: 
    name pos 
0 n1 1 
1 n2 2 
2 n3 3 

df2: 
    name pos 
0 n1 1 
1 n3 2 
2 n4 3 

    name pos_x pos_y 
0 n1  1  1 
1 n2  2  0 
2 n3  3  2 
3 n4  0  3 

Desired Output: 
    name pos 
0 n1 2 
1 n2 2 
2 n3 5 
3 n4 3 

df1df2,所述pos柱正被索引构成。我并不挑剔,pos列可能与索引相同。

任何人都知道更简洁的方法来获得每个名称的最终pos列的计数?

我需要像这样总结数十万个数据帧,我会迭代计算,其中pos列表示每个name的性能。

回答

4

另一种选择是concat,而不是合并:

In [11]: df4 = pd.concat([df1, df2]) 

然后你就可以GROUPBY '名称',总结的结果(POS):

In [12]: g = df4.groupby('name', as_index=False) 

In [13]: g.sum() 
Out[13]: 
    name pos 
0 n1 2 
1 n2 2 
2 n3 5 
3 n4 3