含三个字段的用户表当email和mobile有一个重复时即认为是同一个user,查询共几个user?【Python】

该篇博客介绍了如何在数据集中通过Python的pandas库处理重复数据,以确定实际的唯一用户数量。作者提供了具体步骤,包括对email和mobile两列分别去重,然后找出这两列去重后的索引交集,从而确定不重复的user数量。这种方法适用于处理存在多个标识符的用户数据集。
摘要由CSDN通过智能技术生成

来自牛客网分享:字节跳动暑期实习商业产品数据分析笔试题3.6

https://www.nowcoder.com/discuss/614385?type=post&order=time&pos=&page=1&channel=-1&source_id=search_post_nctrack

”现有一个含三个字段的用户表,id/email/mobile, id是自动递增的,不具有重复性。当email和mobile有一个重复时即认为是同一个user, 请用一种方法查询表中实际有几个user?“

举一个例子ob,同一列里相同的字母表示重复的字段

import pandas as pd
ob = {"email":['E','F','F','E','G'],"tell":['A','A','B','C','D']}
ob = pd.DataFrame(ob)
	email	tell
0	E	A
1	F	A
2	F	B
3	E	C
4	G	D

由于0,1"tell"字段相同;1,2"tell"字段相同;0,3"email"字段相同,0,1,2,3是同一个user,ob中一共两个user

第一步:两列分别去重,每个重复的字段留下第一个,记录去重后的索引值f1,f2
第二步:找出f1和f2中重复的索引,数量就是真正的不重复的user数量

f1 = ob['email'].drop_duplicates(keep='first', inplace=False)
f1
0    E
1    F
4    G
Name: email, dtype: object
f2 = ob['tell'].drop_duplicates(keep='first', inplace=False)
f2
0    A
2    B
3    C
4    D
Name: tell, dtype: object

接下来就是找f1和f2的重复项,方法很多,写函数做也可,不过我这里使用了一些函数,先把f1和f2合并在一起(np.concatenate),再用两次keep参数不同的drop_duplicates()

import numpy as np
L = np.concatenate((f1.index.values,f11.index.values),axis=0) 
L
array([0, 1, 4, 0, 2, 3, 4], dtype=int64)
r1=pd.DataFrame(L).drop_duplicates(keep=False, inplace=False)
# keep=False表示删除全部重复的项
r1
	0
1	1
4	2
5	3
r2=pd.DataFrame(L).drop_duplicates(keep='first', inplace=False)
# keep='first'表示只保留第一个重复项
r2
	0
0	0
1	1
2	4
4	2
5	3
r1.append(r2).drop_duplicates(keep=False) 
	0
0	0
2	4

最后列出的0,4就是不重复的user

【解释】
为什么第二步是找重复项呢?
f1.index={0,1,4},f2.index={0,2,3,4},f1.index记录了第一列中暂且被认为的不重复的user,f2.index记录了第二列中暂且被认为的不重复的user,当index只在其中一个index列里出现时(比如2),说明在另一列里这个index被别的index统一掉了,也就是和另一列的某个index是一个人。所以去掉f1.index+f2.index中只出现一次的项,剩下的就是不重复的user

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值