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

时间:2017-08-21 22:05:16

标签: python pandas dataframe string-formatting

我试图从数据框中删除所有行,如果该行包含可能是“2年”或“3年”或“4年”的几个可能的字符串,依此类推,一直高达'30岁。'

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

如果我只想删除包含'12 Yrs'的行,则此行适用于此:     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

3 个答案:

答案 0 :(得分:2)

您可以将正则表达式与str.contains

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

这是怎么回事:

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]

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