gpt4 book ai didi

python - Pandas 子集基于多列的两个数据框

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:12 24 4
gpt4 key购买 nike

所以,我有两个数据集(我的意思是数据框)如下数据框 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')

而且,我想得到下面的结果

res = df1-df2

基于idacctno的公共(public)列。我们可以看到,根据idacctno,dataframe2 在 dataframe1 中。但是 dataframe1 还有更多dataframe2 中不常见的记录。

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

那么,结果应该是这样的

ssd, 53, 1901, 238003
ggh, 52, 2221, 222222
eet, 50, 9920, 111111

最佳答案

设置

def rpd(text='', sep='\s{1,}', *args, **kwargs):
kw = dict(engine='python', sep=sep)
return pd.read_csv(pd.io.common.StringIO(text), *args, **kw, **kwargs)

df1 = rpd(sep=',\s*', text="""\
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""")

df2 = rpd(sep=',\s*', text="""\
name, age, id, acctno
abc, 11, 1001, 238238
def, 55, 2001, 299299
xxy, 90, 2020, 101010""")

掩码

df2_tups = [*zip(df2.id, df2.acctno)]
mask = [t not in df2_tups for t in zip(df1.id, df1.acctno)]
df1[mask]

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

合并

merge 函数/方法有一个 indicator 参数,如果设置为 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

Google Colab

GitHub

关于python - Pandas 子集基于多列的两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51913604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com