在 pandas 数据框的同一列中删除包含值子字符串的行的最快方法
Fastest way to remove rows that contain substrings of values in the same column of a pandas dataframe
我正在尝试编写一些有效的代码来删除 pandas 数据帧的行,其中特定列中的值是同一列中其他值(至少一个值的子集)的子字符串。
例如,考虑以下输入数据框中的列 B
:
| | A | B |
|---|----|------------|
| 0 | 22 | ab |
| 1 | 33 | abc |
| 2 | 44 | abcd |
| 3 | 55 | a |
| 4 | 66 | john |
| 5 | 77 | john Doe |
| 6 | 88 | jo |
| 7 | 99 | john hi Doe|
输出数据帧:
| | A | B |
|---|----|------------|
| 2 | 44 | abcd |
| 5 | 77 | john Doe |
| 7 | 99 | john hi Doe|
第 0、1 和 3 行已被删除,因为它们在第 B
列(ab
、abc
和 a
)的所有值都是该列中的其他值(即 abcd
)。第 4 行和第 6 行也是如此。
您可以使用一些列表理解来检查行字符串是否在数据框的其他行中:
m = df['B'].apply(lambda x: any([x for y in df['B'] if x != y if x in y]))
df = df[~m]
df
Out[1]:
A B
2 44 abcd
5 77 john Doe
7 99 john hi Doe
我正在尝试编写一些有效的代码来删除 pandas 数据帧的行,其中特定列中的值是同一列中其他值(至少一个值的子集)的子字符串。
例如,考虑以下输入数据框中的列 B
:
| | A | B |
|---|----|------------|
| 0 | 22 | ab |
| 1 | 33 | abc |
| 2 | 44 | abcd |
| 3 | 55 | a |
| 4 | 66 | john |
| 5 | 77 | john Doe |
| 6 | 88 | jo |
| 7 | 99 | john hi Doe|
输出数据帧:
| | A | B |
|---|----|------------|
| 2 | 44 | abcd |
| 5 | 77 | john Doe |
| 7 | 99 | john hi Doe|
第 0、1 和 3 行已被删除,因为它们在第 B
列(ab
、abc
和 a
)的所有值都是该列中的其他值(即 abcd
)。第 4 行和第 6 行也是如此。
您可以使用一些列表理解来检查行字符串是否在数据框的其他行中:
m = df['B'].apply(lambda x: any([x for y in df['B'] if x != y if x in y]))
df = df[~m]
df
Out[1]:
A B
2 44 abcd
5 77 john Doe
7 99 john hi Doe