Python 如果值存在于其他df中,则删除行
我有两个数据帧Python 如果值存在于其他df中,则删除行,python,pandas,dataframe,drop,Python,Pandas,Dataframe,Drop,我有两个数据帧df和ds 作为pd进口熊猫 ds = pd.DataFrame({'Price': {0: 1200, 1: 1400, 2: 1500, 3: 1800}, 'Time(s)': {0: 500, 1: 500, 2: 600, 3: 500}, 'id': {0: 'a0
df
和ds
作为pd进口熊猫
ds = pd.DataFrame({'Price': {0: 1200, 1: 1400, 2: 1500,
3: 1800},
'Time(s)': {0: 500, 1: 500, 2: 600,
3: 500},
'id': {0: 'a01', 1: 'a02', 2: 'a03',
3: 'a04'}})
df = pd.DataFrame({'Price': {0: 1200, 1: 1500, 2: 1450,
3: 1800, 4: 1200},
'Time(s)': {0: 500, 1: 500, 2: 500,
3: 500, 4: 500},
'id': {0: 'a01', 1: 'a02', 2: 'a03',
3: 'a04', 4: 'a05 '}})
ds输出:
Price Time(s) id
1200 500 a01
1400 500 a02
1500 600 a03
1800 500 a04
Price Time(s) id
1200 500 a01
1500 500 a03
1450 500 a02
1800 500 a04
1200 500 a05
df输出:
Price Time(s) id
1200 500 a01
1400 500 a02
1500 600 a03
1800 500 a04
Price Time(s) id
1200 500 a01
1500 500 a03
1450 500 a02
1800 500 a04
1200 500 a05
所需输出:
df1:
Price Time(s) id
1200 500 a05
我想比较它们,如果两个datframes的id
列中有相同的值,请将它们删除,并将结果保存到新的数据帧df1
,我尝试:
df1=pd.concat([ds,df])
df1.删除重复项(subset='id',keep='last')
但是数值是相同的这样就可以了:
ds.merge(df, on='id', how='outer', indicator=True, suffixes=('_xxx',''))
.query('_merge!="both"')[df.columns]
合并模拟SQL完全外部联接indicator=True
添加\u merge
列,该列显示仅左、仅右或同时显示这两个
,在这种情况下,任何不同时显示这两个的都是解决方案,但一般来说,您可以在后续查询筛选器中更加具体
在某些情况下,使用
pd.concat
的其他建议也会奏效,但在我看来,这些建议不够通用。这些解决方案可能包括来自两个数据帧的唯一记录,但在本例中,您是从另一个数据帧请求的。keep=False
应该可以做到这一点。另外,它必须作为布尔而不是字符串传递
pd.concat([df, ds]).drop_duplicates(subset='id', keep=False, ignore_index=True)
输出:
Price Time(s) id
0 1200 500 a05
df1=pd.merge(df,ds,how='outer',on='id',indicator='common')
df1=df1.loc[df1['common']!='both']
df1矢量化过孔也是一个选项:
将熊猫作为pd导入
将numpy作为np导入
ds=pd.DataFrame({'Price':{0:1200,1:1400,2:1500,
3: 1800},
"时间:{0:500,1:500,2:600,,
3: 500},
'id':{0:'a01',1:'a02',2:'a03',
3:'a04'}})
df=pd.DataFrame({'Price':{0:1200,1:1500,2:1450,
3: 1800, 4: 1200},
"时间:{0:500,1:500,2:500,,
3: 500, 4: 500},
'id':{0:'a01',1:'a02',2:'a03',
3:'a04',4:'a05'}})
out=df.loc[np.where(df['id'].isin(ds['id']),False,True]
#展示
打印(输出到字符串(索引=False))
价格时间id
1200 500 a05
这回答了你的问题吗?使用
keep=False
删除所有duplicates@Nick不,那不是mine@Nickkeep=false在pd.concat()false
用大写字母拼写后仍无法提供完整的数据帧<代码>df1。删除重复项(subset='id',keep=False)