我试图从数据框中删除所有行,如果该行包含可能是“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
答案 0 :(得分:2)
您可以将正则表达式与str.contains
:
df_x[~df_x.Col.str.contains(r'\d+ Yrs')]
\d+
会匹配任意数量的数字(但至少需要一个),因此它也会匹配O Yrs
,1000 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]
如果需要,您可以合并最后两行