检查文本列中的数值 - python
Check for numeric value in text column - python
10 列数据框 (df) 中的 5 列 (col1 - col5) 应为空白或仅包含文本值。如果这 5 列中的任何一行具有全数值,我需要触发错误。编写了以下代码来识别 'col1' 中值为全数字的行。 (我将使用相同的代码循环浏览所有 5 列):
df2 = df[df['col1'].str.isnumeric()]
我收到以下错误:ValueError:无法使用包含 NA / NaN 值的数组进行屏蔽
这是因为空白值创建的是 NaN 而不是 False。我在创建列表而不是使用以下内容时看到了这一点:
lst = df['col1'].str.isnumeric()
关于如何解决这个问题有什么建议吗?谢谢
试试这个解决 NaN
import pandas as pd
df = pd.DataFrame([{'col1':1}, {'col1': 'a'}, {'col1': None}])
lst = df['col1'].astype(str).str.isnumeric()
if lst.any():
raise ValueError()
方法如下:
import string
df['flag'] = (df
.applymap(lambda x: any(i for i in x if i in string.digits))
.apply(lambda x: f'Fail: {",".join(df.columns[x].tolist())} is numeric', 1))
print(df)
col1 col2 flag
0 a 2.04 Fail: col2 is numeric
1 2.02 b Fail: col1 is numeric
2 c c Fail: is numeric
3 d e Fail: is numeric
解释:
- 我们遍历数据帧的每个值并检查它是否是数字和 return 布尔值。
- 我们使用该布尔值对列名称进行子集化
Sample Data
df = pd.DataFrame({'col1': ['a','2.02','c','d'],
'col2' : ['2.04','b','c','e']})
10 列数据框 (df) 中的 5 列 (col1 - col5) 应为空白或仅包含文本值。如果这 5 列中的任何一行具有全数值,我需要触发错误。编写了以下代码来识别 'col1' 中值为全数字的行。 (我将使用相同的代码循环浏览所有 5 列):
df2 = df[df['col1'].str.isnumeric()]
我收到以下错误:ValueError:无法使用包含 NA / NaN 值的数组进行屏蔽
这是因为空白值创建的是 NaN 而不是 False。我在创建列表而不是使用以下内容时看到了这一点:
lst = df['col1'].str.isnumeric()
关于如何解决这个问题有什么建议吗?谢谢
试试这个解决 NaN
import pandas as pd
df = pd.DataFrame([{'col1':1}, {'col1': 'a'}, {'col1': None}])
lst = df['col1'].astype(str).str.isnumeric()
if lst.any():
raise ValueError()
方法如下:
import string
df['flag'] = (df
.applymap(lambda x: any(i for i in x if i in string.digits))
.apply(lambda x: f'Fail: {",".join(df.columns[x].tolist())} is numeric', 1))
print(df)
col1 col2 flag
0 a 2.04 Fail: col2 is numeric
1 2.02 b Fail: col1 is numeric
2 c c Fail: is numeric
3 d e Fail: is numeric
解释:
- 我们遍历数据帧的每个值并检查它是否是数字和 return 布尔值。
- 我们使用该布尔值对列名称进行子集化
Sample Data
df = pd.DataFrame({'col1': ['a','2.02','c','d'],
'col2' : ['2.04','b','c','e']})