Python 基于多列的两个数据帧子集
因此,我有两个数据集(我指的是dataframe),如下所示 数据帧1: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
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