试图找出如何根据另一个 DataFrame 中存在的值从一列中减去一个常量。例如,如果我有下面的 DataFrame a
,其中包含一个名为 person
name 和 count
的列:
a = pd.DataFrame({
"person":["Bob", "Kate", "Joe", "Mark"],
"count":[1, 2, 3, 4],
})
person count
0 Bob 3
1 Kate 4
2 Joe 5
2 Mark 4
以及包含 Person
和任何其他任意列的第二个 DataFrame:
b = pd.DataFrame({
"person":["Bob", "Joe"],
"foo":['a', 'b'],
})
person foo
0 Bob a
1 Joe c
我希望我可以将第一个 DataFrame 更改为如下所示。具体来说,对于 DataFrame count
中的任何 person
实例,将 b
减一。可以安全地假设 DataFrame b
将始终是 DataFrame a
的子集并且 person
将是唯一的。
Person Count
0 Bob 2
1 Kate 4
2 Joe 3
2 Mark 4
非常感谢!
答案 0 :(得分:1)
a["count"] -= a.person.isin(b.person)
使用 isin
,我们得到每个人的 True
和 False
的布尔数组,如果它在另一个人中。然后把它当作整数,我们可以从count
列中减去它,
得到
>>> a
person count
0 Bob 2
1 Kate 4
2 Joe 4
3 Mark 4
答案 1 :(得分:0)
这个答案假设 df2
可以有一个名称的多个实例。如果它只是一个实例,您可以通过迭代并检查该人是否在第二个数据框中命名来进行减法。在df2
:
df2_counts = df2['Person'].value_counts()
在 df1
中,加入这些数据,然后减去计数:
df1['subtracts'] = df1.set_index('Person').join(df2_counts)
df1['count_new'] = df1['count'] - df1['subtracts']
答案 2 :(得分:-1)
从数据集 B 创建一个人名列表:
listDFB=DFB['person']
遍历 dfa 以相应地填充新列
for i, rw in dfa.iterrows():
if rw['person'] in listDFB:
rw['count']=rw['count']-1