我需要跟踪命名列的每个位置。因此,如果第一列具有相同的名称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
在df1
和df2
中,pos
列正在由索引构建。我不挑剔,pos
列可能与索引相同。
任何人都知道更简洁的方法来获取每个名称的最终pos
列中的计数吗?
我需要对我将迭代计算的数十万个数据帧进行总结,其中pos
列表示每个name
的性能。
答案 0 :(得分:4)
另一种选择是concat而不是合并:
In [11]: df4 = pd.concat([df1, df2])
然后你可以将'name'分组,并对结果(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