筛选跨列具有重叠值的数据帧行

2024-04-28 11:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,它反映了行中至少有一个id冲突的行

      email id1 id2 id3
0      de@l  Z7  Q4  Q4
1     sco@g  Q4  Z7  Q4
2   alpha@n  Q4  Z7  Z7
3   numer@o  Z7  Z7  Q4
4    endo@c  D8  D8  L1
5  chrono@k  L1  L1  D8

第0-3行和第4-5行的id值与其他行重叠,但重叠发生在不同的列上

我怎样才能:

  1. 除去每个重叠组的第一行以外的所有内容
  2. 以表方式或系列方式,即不使用df.apply()向下移动行

这将是输出(尽管不关心索引):

      email id1 id2 id3
0      de@l  Z7  Q4  Q4
4    endo@c  D8  D8  L1

下面的代码片段便于重新编写

pd.DataFrame([
    {'email':'de@l', 'id1':'Z7', 'id2':'Q4', 'id3':'Q4'},
    {'email':'sco@g', 'id1':'Q4', 'id2':'Z7', 'id3':'Q4'},
    {'email':'alpha@n', 'id1':'Q4', 'id2':'Z7', 'id3':'Z7'},
    {'email':'numer@o', 'id1':'Z7', 'id2':'Z7', 'id3':'Q4'},
    {'email':'endo@c', 'id1':'D8', 'id2':'D8', 'id3':'L1'},
    {'email':'chrono@k','id1':'L1', 'id2':'L1', 'id3':'D8'},
])

Tags: alphaidl1emaildeid3id2chrono
2条回答

您可以将^{}^{}一起使用,然后我们创建一个布尔索引

arr = df.filter(like='id').to_numpy().astype(str)
arr = np.apply_along_axis(np.unique, 1, arr)
m = (arr[1:]!=arr[:-1]).all(axis=1)
m = np.r_[False, m]

df[m]

    email id1 id2 id3
0    de@l  Z7  Q4  Q4
4  endo@c  D8  D8  L1

想法是将具有id值的列转换为称为frozensets的散列集,这样就可以通过^{}中带有反转掩码的^{}进行筛选:

df = df[~df.filter(like='id').apply(frozenset, axis=1).duplicated()]
#for test all columns without first
#df = df[~df.iloc[:, 1:].apply(frozenset, axis=1).duplicated()]
print (df)
    email id1 id2 id3
0    de@l  Z7  Q4  Q4
4  endo@c  D8  D8  L1

列表理解的备选方案:

L = [frozenset(x) for x in df.filter(like='id').to_numpy()]
df = df[~pd.Series(L, index=df.index).duplicated()]

相关问题 更多 >