使用格式化为字符串的数字列表删除包含这些值的数据框中的行

using list of numbers formatted as strings to delete the rows in a dataframe containing those values

我正在尝试从数据框中删除所有行,如果该行包含多个可能的字符串,这些字符串可能是“2 年”、“3 年”或“4 年”等等,一直向上高达“30 岁”。

为了干净地做到这一点,我想在一行中做到这一点。所以我正在尝试编写代码以使用字符串格式一次引用所有这些数字。

如果我只想删除包含“12 岁”的行,此行适用于此: df_x = df_x[df_x.Col.str.contains('%d Yrs' % 12) == False]

其中:

df_x 是我的数据框

col 是我的专栏名称

所以....

如何删除包含“2 年”、“3 年”、“4 年”等所有可能字符串的所有行?

这是我的尝试:

year_numbers = range(0,30)
number_of_years = list(year_numbers)
df_x = df_x[df_x.Col.str.contains('%d Yrs' % tuple(number_of_years)) == False]

输出:

TypeError: not all arguments converted during string formatting

怎么样:

remove_years = ['{} Yrs'.format(x) for x in range(30)]
mask = df_x['Col'].apply(lambda x: x in remove_years)
df_x = df_x[mask]

如果需要,您可以合并最后两行

您可以使用正则表达式 str.contains:

df_x[~df_x.Col.str.contains(r'\d+ Yrs')]

\d+ 将匹配任意数量的数字(但至少需要一个),因此它也将匹配 O Yrs1000 Yrs 等。

IIUC:

import re

In [142]: df
Out[142]:
              Col
0   aaa 1 Yrs bbb
1   aaa 2 yrs bbb
2   aaa 3 Yrs bbb
3  aaa 10 yrs bbb
4  aaa 30 Yrs bbb
5  aaa 31 yrs bbb
6  aaa 50 Yrs bbb
7  xxxxxxxxxxxxxx

In [143]: df[~pd.to_numeric(df.Col.str.extract(r'(\d+)\s+yrs', flags=re.I, expand=False),
     ...:                   errors='coerce')
     ...:        .between(2, 30)]
     ...:
Out[143]:
              Col
0   aaa 1 Yrs bbb
5  aaa 31 yrs bbb
6  aaa 50 Yrs bbb
7  xxxxxxxxxxxxxx