2013-10-02 163 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