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

来自牛客网分享:字节跳动暑期实习商业产品数据分析笔试题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)

r1
    0
1   1
4   2
5   3
r2=pd.DataFrame(L).drop_duplicates(keep='first', inplace=False)

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

Original: https://blog.csdn.net/ZZqnmdr/article/details/115348002
Author: ZZqnmdr
Title: 含三个字段的用户表当email和mobile有一个重复时即认为是同一个user,查询共几个user?【Python】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/743035/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球