Python 使用格式化为字符串的数字列表删除包含这些值的数据帧中的行
如果数据帧中的行包含多个可能的字符串,可能是“2年”、“3年”或“4年”等等,那么我将尝试从数据帧中删除所有行,直到“30年”为止 为了干净利落地做这件事,我想在一行中做这件事。因此,我尝试编写代码,使用字符串格式一次引用所有这些数字 如果我只想删除包含“12年”的行,这行代码适用于: df_x=df_x[df_x.Col.str.contains('%d年'%12)=False] 其中: df_x是我的数据帧 Col是我的列名 所以 如何删除包含所有可能字符串的所有行,包括“2年”、“3年”、“4年”等等 以下是我的尝试:Python 使用格式化为字符串的数字列表删除包含这些值的数据帧中的行,python,pandas,dataframe,string-formatting,Python,Pandas,Dataframe,String Formatting,如果数据帧中的行包含多个可能的字符串,可能是“2年”、“3年”或“4年”等等,那么我将尝试从数据帧中删除所有行,直到“30年”为止 为了干净利落地做这件事,我想在一行中做这件事。因此,我尝试编写代码,使用字符串格式一次引用所有这些数字 如果我只想删除包含“12年”的行,这行代码适用于: df_x=df_x[df_x.Col.str.contains('%d年'%12)=False] 其中: df_x是我的数据帧 Col是我的列名 所以 如何删除包含所有可能字符串的所有行,包括“2年”、“3年”、
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]
如果需要,您可以将最后两行组合起来。您可以将正则表达式用于:
\d+
将匹配任意数量的数字(但至少需要一个),因此它也将匹配O年
,1000年
,依此类推。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
一行!=很清楚,你可以使用lambda表达式,比如下面的代码:rows_with_strings=df.apply(lambda row:any([isinstance(e,basestring)for e in row]),axis=1)@wwii最有用的答案在一行就解决了!但我明白你的意思——情况并非总是如此。如果他只想要数字不超过30,那可能是个问题,你必须真的扩展这个表达式think@MattTakao当前位置问题的编写方式,听起来似乎唯一存在的输入增加到30,而不是OP想要保持31或更高。无论如何,如果需要的话,更新正则表达式只是一个很小的修复。@JohnZwinck你是对的。没有大于30的输入。@ThomasErnste我很高兴它起作用了。别忘了用最有用的答案将问题标记为已解决。:)我只是想知道怎么做。完成!使用Pandas时,
apply()
几乎从来都不是正确的解决方案。非常慢。
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