Python 基于多列的两个数据帧子集

Python 基于多列的两个数据帧子集,python,pandas,dataframe,subset,Python,Pandas,Dataframe,Subset,因此,我有两个数据集(我指的是dataframe),如下所示 数据帧1: name, age, id, acctno abc, 23, 1001, 238238 dhd, 22, 2001, 299299 ddg, 30, 2920, 101010 ssd, 53, 1901, 238003 ggh, 52, 2221, 222222 eet, 50, 9920, 111111 (我们可以将其另存为population1.csv) 数据帧2: name, age, id, acctno abc

因此,我有两个数据集(我指的是dataframe),如下所示 数据帧1:

name, age, id, acctno
abc, 23, 1001, 238238
dhd, 22, 2001, 299299
ddg, 30, 2920, 101010
ssd, 53, 1901, 238003
ggh, 52, 2221, 222222
eet, 50, 9920, 111111
(我们可以将其另存为population1.csv)

数据帧2:

name, age, id, acctno
abc, 11, 1001, 238238
def, 55, 2001, 299299
xxy, 90, 2020, 101010
(我们可以将其保存为population2.csv)

因此,我们可以如下读取数据

df1 = pd.read_csv('population1.csv')
df2 = pd.read_csv('population2.csv')
ssd, 53, 1901, 238003
ggh, 52, 2221, 222222
eet, 50, 9920, 111111
我想得到以下结果

res = df1-df2
基于
id
acctno
的公共列。 我们可以看到,基于
id
acctno
, dataframe2位于dataframe1中。但dataframe1还有更多功能 dataframe2中不常见的记录

基于一列对两个数据帧进行子集是直截了当的, 但是,我想知道如何基于两个数据帧对两个数据帧进行子集 列

因此,结果应该如下

df1 = pd.read_csv('population1.csv')
df2 = pd.read_csv('population2.csv')
ssd, 53, 1901, 238003
ggh, 52, 2221, 222222
eet, 50, 9920, 111111
安装程序
mask

合并
merge
函数/方法有一个
指示符
参数,如果设置为
True
,则会添加一列,告诉您合并标识符所在的数据源。在你的情况下,你想抓住那些只剩下的

df1.merge(
    df2[['id', 'acctno']], how='left', indicator=True
).query('_merge == "left_only"').drop('_merge', 1)

  name  age    id  acctno
2  ddg   30  2920  101010
3  ssd   53  1901  238003
4  ggh   52  2221  222222
5  eet   50  9920  111111


使用
concat
的解决方案,其中我们
concat
df1
df2
,然后再次
df2
,因此
df2
中的所有行都保证被删除(如果数据帧非常大,这可能会导致内存效率低下):


如果您希望在
df1
中保留重复项,此答案将忽略您的愿望。

isin
应用
元组

df1.loc[~df1[['id', 'acctno']].apply(tuple,1).isin(df2[['id', 'acctno']].apply(tuple,1))]
Out[215]: 
  name  age    id  acctno
2  ddg   30  2920  101010
3  ssd   53  1901  238003
4  ggh   52  2221  222222
5  eet   50  9920  111111

我相信您在
df2
中有输入错误。我认为第四行的
id
应该是
2920
聪明!但是,如果df1中的某些重复是故意的,我会称之为我答案的“功能”:)但这是一个好的观点,我会澄清:哦,我喜欢你接受CoLab运行时的方式@是的,我想我会喜欢的
df1.loc[~df1[['id', 'acctno']].apply(tuple,1).isin(df2[['id', 'acctno']].apply(tuple,1))]
Out[215]: 
  name  age    id  acctno
2  ddg   30  2920  101010
3  ssd   53  1901  238003
4  ggh   52  2221  222222
5  eet   50  9920  111111