0

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

假设我有两个 PandasDataFramedf0df1如下所示:

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']A20Bdf0uA10Bdf0vA

目标是最终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

正如我一开始所说,这只是一个玩具示例。我有兴趣使用更多的操作来进行这种键限制更新,而不仅仅是减法。

用 Pandas 做这种事情的最简单方法是什么?

4

2 回答 2

1

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

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

df2 = df0.sort()

df2["B"] = df2["B"] - df1["B"]
于 2013-04-30T16:10:08.757 回答
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
于 2013-04-30T20:35:40.863 回答