如何在Pandas中执行密钥限制的广播操作更新?

时间:2013-04-30 15:47:36

标签: pandas

以下是我想要做的操作类型的简单玩具示例。

假设我有两只Pandas DataFrame s df0df1,就像这样:

In [2]: df0
Out[2]: 
   A   B  C
0  v  67  7
1  u  30  8
2  v  71  9
3  u  31  1
4  u  27  1
5  v  60  7
6  v  78  9
7  u  41  7

In [3]: df1
Out[3]: 
   A   B
0  u  20
1  v  10

请注意,df1的所有列都在df0中。另请注意,df1['A']中的值是唯一的,实际上它们代表df0['A']中出现的所有值(带有重复)。

我想从df1['B'] 到位,从广播 df0['B']中删除df0['B']到根据值的正确形状A列的内容。 (最终结果是20B字段中df0的所有u行的A字段中减去10;同样,从B字段中df0的所有v行的A字段中减去df0

目标是以In [4]: df0 Out[4]: A B C 0 v 57 7 1 u 10 8 2 v 61 9 3 u 11 1 4 u 7 1 5 v 50 7 6 v 68 9 7 u 21 7 结尾,如下所示:

{{1}}

正如我在开头所说,这只是一个玩具的例子。我有兴趣用更多的操作来做这种密钥限制的更新,而不仅仅是减法。

用熊猫做这种事的最简单方法是什么?

2 个答案:

答案 0 :(得分:1)

我不确定这是否足够强大以处理您可能想到的任何情况,但按“A”列编制索引将为您提供匹配/操作功能。

df0.set_index("A", inplace=True)
df1.set_index("A", inplace=True)

df2 = df0.sort()

df2["B"] = df2["B"] - df1["B"]

答案 1 :(得分:1)

这也可以使用apply来完成,无需排序。

In [188]: def f(s):
   .....:     s['B'] -= df1.loc[df1.A == 'v', 'B'].iat[0]
   .....:     return s
   .....: 


In [189]: df0.apply(f, axis=1)
Out[189]: 
   A   B  C
0  v  57  7
1  u  20  8
2  v  61  9
3  u  21  1
4  u  17  1
5  v  50  7
6  v  68  9
7  u  31  7