以下是我想要做的操作类型的简单玩具示例。
假设我有两只Pandas DataFrame
s df0
和df1
,就像这样:
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
列的内容。 (最终结果是20
从B
字段中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}}
正如我在开头所说,这只是一个玩具的例子。我有兴趣用更多的操作来做这种密钥限制的更新,而不仅仅是减法。
用熊猫做这种事的最简单方法是什么?
答案 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