Python 在不同数据帧的两列之间“选择条件存在的位置”

Python 在不同数据帧的两列之间“选择条件存在的位置”,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个数据帧: 数据1={ “id”:[1,1,2,2], “标签”:[700800], “成员资格”:[1,0.9,0.8,0.7], } 数据2={ “id”:[1,2,3,3], “标签”:[700800600500], “成员资格”:[0.5,0.9,0.8,0.7], } df1=pd.DataFramedata1 df2=pd.DataFramedata2 这看起来像: >>>df1 id标签成员资格 0 1 700 1.0 1 1 80

我有两个数据帧:

数据1={ “id”:[1,1,2,2], “标签”:[700800], “成员资格”:[1,0.9,0.8,0.7], } 数据2={ “id”:[1,2,3,3], “标签”:[700800600500], “成员资格”:[0.5,0.9,0.8,0.7], } df1=pd.DataFramedata1 df2=pd.DataFramedata2 这看起来像:

>>>df1 id标签成员资格 0 1 700 1.0 1 1 800 0.9 2 2 700 0.8 3 2 800 0.7 >>>df2 id标签成员资格 0 1 700 0.5 1 2 800 0.9 2 3 600 0.8 3 3 500 0.7 我想将行从df1添加到df2,其中id、tag的组合在df2中不存在。 因此,任何不带df1['id']==df2['id']和df1['tag']==df2['tag']条件的行都应添加到df2:

>>>df2 id标签成员资格 0 1 700 0.5 1 2 800 0.9 2 3 600 0.8 3 3 500 0.7 4 1 800 0.9增加了这一行 52700 0.8增加了这一行 我所尝试的: 我尝试查找条件不正确的行,然后将结果附加到df2:

新行=df1[~df1['id']==df2['id']&df1['tag']==df2['tag']] df2=df2.appendnew_rows.reset_indexdrop=True 但正如您所看到的,我得到了错误的结果,因为id,2800的标记对已经存在于df2中。为什么呢

>>>df2 id标签成员资格 0 1 700 0.5 1 2 800 0.9 2 3 600 0.8 3 3 500 0.7 4 1 800 0.9正确 52700 0.8正确 6 2 800 0.7不应添加此项 给你:

df3 = pd.merge(df2,df1,on=['id','tag'],how='outer')
df3 = df3[df3.Membership_x.isna()][['id','tag','Membership_y']].rename(columns={'Membership_y':'Membership'})
df3 = df2.append(df3)
df3
印刷品

id  tag Membership
0   1   700 0.5
1   2   800 0.9
2   3   600 0.8
3   3   500 0.7
4   1   800 0.9
5   2   700 0.8
解决方案使用:

索引=['id','tag'] 左=df2。设置索引 右=df1。设置索引 组合=left.combine\u firstright.reset\u索引 合二为一 结果:

   id  tag  Membership
0   1  700         0.5
1   1  800         0.9
2   2  700         0.8
3   2  800         0.9
4   3  500         0.7
5   3  600         0.8

在此条件下使用的相等运算符:

(df1['id'] == df2['id']) & (df1['tag'] == df2['tag'])
不是这个工作的合适工具,它不像您期望的那样工作,它逐行比较数据帧。让我们从一个简单的案例开始:

In [5]: df1['id'] == df2['id']
Out[5]: 
0     True
1    False
2    False
3    False
Name: id, dtype: bool
在这两个系列的第0行中都可以找到Id 1,因此可以得到True。Id 2出现在两个系列中,但从不在同一行上,位置从不匹配。标签也一样:

因此,当与&组合时,只有第一行匹配:

In [7]: (df1['id'] == df2['id']) & (df1['tag'] == df2['tag'])
Out[7]: 
0     True
1    False
2    False
3    False
dtype: bool
这就是为什么2800的id、标记对不能被识别为已经存在的原因


因此,您应该按照其他答案的建议使用merge,而不是equality运算符。

有用的解释,谢谢您能解释一下它是如何工作的吗?所以我可以选择它作为接受答案谢谢,但它增加了额外的列,我不想用handsOh删除或重命名这些列。我已经在代码中处理了重命名。我只是再次尝试执行,没有看到额外的列。
In [7]: (df1['id'] == df2['id']) & (df1['tag'] == df2['tag'])
Out[7]: 
0     True
1    False
2    False
3    False
dtype: bool