检查文本列中的数值 - 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']})