我有一个这样的数据框:
A B
exa 3
example 6
exam 4
hello 4
hell 3
我要删除作为另一行的子字符串的行,并保留最长的行(请注意,B已经是A的长度)
我希望我的桌子看起来像这样:
A B
example 6
hello 4
我考虑过以下布尔过滤器,但它不起作用:(
df['Check'] = df.apply(lambda row: df.count(row['A'] in row['A'])>1, axis=1)
答案 0 :(得分:3)
这是不平凡的。但是我们可以利用B
来对数据进行排序,将每个值与仅比其大的那些字符串进行比较,以获得比O(N ^ 2)更好的解决方案。
df = df.sort_values('B')
v = df['A'].tolist()
df[[not any(b.startswith(a) for b in v[i + 1:]) for i, a in enumerate(v)]].sort_index()
A B
1 example 6
3 hello 4
答案 1 :(得分:1)
就像我的解决方案也是O(m * n)一样感冒(在您的情况下,m = n)
df[np.sum(np.array([[y in x for x in df.A.values] for y in df.A.values]),1)==1]
Out[30]:
A B
1 example 6
3 hello 4