我不知道我是否清楚地表达了这一点。我有两个DataFrame:
In [1]: d1 = pd.DataFrame({'a':[1,1,1,2,2,2,3,3,3], 'b':np.random.randint(1,9,9)})
In [2]: d1
Out[2]:
a b
0 1 1
1 1 7
2 1 5
3 2 2
4 2 8
5 2 1
6 3 5
7 3 5
8 3 8
In [3]: d2 = pd.DataFrame({'a':[1,2,3], 'd':[7,2,9]})
In [4]: d2
Out[4]:
a d
0 1 7
1 2 2
2 3 9
我希望在d2中找到与d1中每行相同的'a'的行,并在d2中将此'a'的'd'添加到d1中所有相应行的'b'。换句话说,当执行操作列'b'加'd'时,它将自动广播,就像'a'是索引一样。结果可能如下:
a b
0 1 8
1 1 14
2 1 12
3 2 4
4 2 10
5 2 3
6 3 14
7 3 14
8 3 17
我知道d1.groupby('a').apply(lambda x: x - d2[d2['a']==x.iloc[0]['a']]['d'].values)
可以做到这一点。但它似乎太复杂了。
以下代码可以做同样的事情。但我认为这不是使用索引的正确方法。
d1.set_index('a', inplace=True)
d2.set_index('a', inplace=True)
d1 + d2
d1.reset_index(inplace=True)
d2.reset_index(inplace=True)
答案 0 :(得分:2)
您无需更改d1
的索引。只需使用d2
作为索引的a
系列。然后,您可以使用系列的map
方法:
d2 = d2.set_index('a').d
d1.b + d1.a.map(d2)
答案 1 :(得分:1)
或另一种方法:
df = d1.merge(d2, how='right', on='a')
df['sum'] = df.b + df.d
df
屈服(np.random.seed(0)
):
a b d sum
0 1 5 7 12
1 1 8 7 15
2 1 6 7 13
3 2 1 2 3
4 2 4 2 6
5 2 4 2 6
6 3 4 9 13
7 3 8 9 17
8 3 2 9 11
如果您不需要所有这些额外的列,则可以使用以下方法将其删除:
df.drop(['b','d'], axis=1, inplace=True)