删除包含任何数字子字符串的列行

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 可以正确地告诉我这些具有一个或多个数字子字符串的元素都是数字?我的最终目标是删除这些仅包含数字的行。

我认为需要 splitall 的列表理解来检查所有数字字符串:

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.mapany 和生成器表达式、str.isdecimalstr.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()))

请注意 isdecimalisdigitmore strict。但是您可能需要在 Python 2.7.

中使用 str.isdigitstr.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