Pandas:在进行算术运算时,如何通过特定列而不是索引来广播值?

时间:2014-12-10 07:45:41

标签: python numpy pandas

我不知道我是否清楚地表达了这一点。我有两个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)

2 个答案:

答案 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)