Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用格式化为字符串的数字列表删除包含这些值的数据帧中的行_Python_Pandas_Dataframe_String Formatting - Fatal编程技术网

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

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年”、

如果数据帧中的行包含多个可能的字符串,可能是“2年”、“3年”或“4年”等等,那么我将尝试从数据帧中删除所有行,直到“30年”为止

为了干净利落地做这件事,我想在一行中做这件事。因此,我尝试编写代码,使用字符串格式一次引用所有这些数字

如果我只想删除包含“12年”的行,这行代码适用于: df_x=df_x[df_x.Col.str.contains('%d年'%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]

如果需要,您可以将最后两行组合起来。

您可以将正则表达式用于:

\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