删除包含任何数字子字符串的列行
Delete Column Rows with Any Numeric Substrings
我注意到当来自 Pandas DataFrame 的列的元素具有数字子字符串时,方法 isnumeric
returns false.
例如:
row 1, column 1 has the following: 0002 0003 1289
row 2, column 1 has the following: 89060 324 123431132
row 3, column 1 has the following: 890GB 32A 34311TT
row 4, column 1 has the following: 82A 34311TT
row 4, column 1 has the following: 82A 34311TT 889 9999C
显然,第 1 行和第 2 行都是数字,但是 isnumeric
returns 第 1 行和第 2 行为假。
我找到了一个变通方法,涉及将每个子字符串分成它们自己的列,然后为每个子字符串创建一个布尔值列以将布尔值加在一起以显示一行是否全部为数字。然而,这很乏味,而且我的功能看起来也不整洁。我也不想去除和替换空格(将所有子字符串压缩成一个数字),因为我需要保留原始子字符串。
有谁知道更简单的 solution/technique 可以正确地告诉我这些具有一个或多个数字子字符串的元素都是数字?我的最终目标是删除这些仅包含数字的行。
我认为需要 split
和 all
的列表理解来检查所有数字字符串:
mask = ~df['a'].apply(lambda x: all([s.isnumeric() for s in x.split()]))
mask = [not all([s.isnumeric() for s in x.split()]) for x in df['a']]
如果要检查是否至少有一个数字字符串使用 any
:
mask = ~df['a'].apply(lambda x: any([s.isnumeric() for s in x.split()]))
mask = [not any([s.isnumeric() for s in x.split()]) for x in df['a']]
这是使用 pd.Series.map
、any
和生成器表达式、str.isdecimal
和 str.split
.
的一种方法
import pandas as pd
df = pd.DataFrame({'col1': ['0002 0003 1289', '89060 324 123431132', '890GB 32A 34311TT',
'82A 34311TT', '82A 34311TT 889 9999C']})
df['numeric'] = df['col1'].map(lambda x: any(i.isdecimal() for i in x.split()))
请注意 isdecimal
比 isdigit
更 more strict。但是您可能需要在 Python 2.7.
中使用 str.isdigit
或 str.isnumeric
删除结果为 False
:
的行
df = df[df['col1'].map(lambda x: any(i.isdecimal() for i in x.split()))]
结果
第一部分逻辑:
col1 numeric
0 0002 0003 1289 True
1 89060 324 123431132 True
2 890GB 32A 34311TT False
3 82A 34311TT False
4 82A 34311TT 889 9999C True
我注意到当来自 Pandas DataFrame 的列的元素具有数字子字符串时,方法 isnumeric
returns false.
例如:
row 1, column 1 has the following: 0002 0003 1289
row 2, column 1 has the following: 89060 324 123431132
row 3, column 1 has the following: 890GB 32A 34311TT
row 4, column 1 has the following: 82A 34311TT
row 4, column 1 has the following: 82A 34311TT 889 9999C
显然,第 1 行和第 2 行都是数字,但是 isnumeric
returns 第 1 行和第 2 行为假。
我找到了一个变通方法,涉及将每个子字符串分成它们自己的列,然后为每个子字符串创建一个布尔值列以将布尔值加在一起以显示一行是否全部为数字。然而,这很乏味,而且我的功能看起来也不整洁。我也不想去除和替换空格(将所有子字符串压缩成一个数字),因为我需要保留原始子字符串。
有谁知道更简单的 solution/technique 可以正确地告诉我这些具有一个或多个数字子字符串的元素都是数字?我的最终目标是删除这些仅包含数字的行。
我认为需要 split
和 all
的列表理解来检查所有数字字符串:
mask = ~df['a'].apply(lambda x: all([s.isnumeric() for s in x.split()]))
mask = [not all([s.isnumeric() for s in x.split()]) for x in df['a']]
如果要检查是否至少有一个数字字符串使用 any
:
mask = ~df['a'].apply(lambda x: any([s.isnumeric() for s in x.split()]))
mask = [not any([s.isnumeric() for s in x.split()]) for x in df['a']]
这是使用 pd.Series.map
、any
和生成器表达式、str.isdecimal
和 str.split
.
import pandas as pd
df = pd.DataFrame({'col1': ['0002 0003 1289', '89060 324 123431132', '890GB 32A 34311TT',
'82A 34311TT', '82A 34311TT 889 9999C']})
df['numeric'] = df['col1'].map(lambda x: any(i.isdecimal() for i in x.split()))
请注意 isdecimal
比 isdigit
更 more strict。但是您可能需要在 Python 2.7.
str.isdigit
或 str.isnumeric
删除结果为 False
:
df = df[df['col1'].map(lambda x: any(i.isdecimal() for i in x.split()))]
结果
第一部分逻辑:
col1 numeric
0 0002 0003 1289 True
1 89060 324 123431132 True
2 890GB 32A 34311TT False
3 82A 34311TT False
4 82A 34311TT 889 9999C True