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