检查文本列中的数值 - python

Posted

技术标签:

【中文标题】检查文本列中的数值 - python【英文标题】:Check for numeric value in text column - python 【发布时间】:2020-02-26 15:52:50 【问题描述】:

10 列数据框 (df) 中的 5 列 (col1 - col5) 应为空白或仅具有文本值。如果这 5 列中的任何行具有全数值,我需要触发错误。编写以下代码来识别“col1”中值是全数字的行。 (我将使用相同的代码循环浏览所有 5 列):

    df2 = df[df['col1'].str.isnumeric()]

我收到以下错误:ValueError: cannot mask with array contains NA / NaN values

这是因为空白值创建的是 NaN 而不是 False。当我使用以下内容创建列表时,我看到了这一点:

    lst = df['col1'].str.isnumeric()

关于如何解决这个问题的任何建议?谢谢

【问题讨论】:

你想触发什么错误?或者你想用其他东西替换数值? 你试过 df['col1'].astype(str).isnumeric() 代替吗? @YOLO 这是更大代码的一部分,我正在对数据进行质量检查。在这种情况下,我将错误写入列“失败:col1 是数字”。我不能使用 where 并直接将此错误写入列,因为错误列需要记录所有错误 - 那些在其他列中发现的错误,用于此特定检查以及在 isnumeric() 检查之外进行的其他检查。 pandas.pydata.org/pandas-docs/stable/reference/api/…。空白字符串创建 False。如果字符串本身是 NaN,请考虑填写 '' 【参考方案1】:

试试这个来解决 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()

【讨论】:

您的预编辑代码对我有用。我可以即时用文本替换 nans,这样我的数据框就创建好了。没试过修改后的代码。这就是我最终使用的:'df2 = df[df['col1'].astype(str).fillna('').str.isnumeric()]' 我已将您的答案标记为解决我的问题的答案,但您可能需要编辑您的回复以包含您的原始回复。【参考方案2】:

这是一种方法:

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

说明:

我们遍历数据帧的每个值并检查它是否为数字并返回一个布尔值。 我们使用该布尔值对列名进行子集化

样本数据

df = pd.DataFrame('col1': ['a','2.02','c','d'],
                  'col2' : ['2.04','b','c','e'])

【讨论】:

尚未测试,但这看起来比我最终使用的更有效。我没有使用它,因为我为每列循环了 3 次不同的检查。根据列中的现有值,每次检查的结果都写入相同的标志 col:1. 如果现有值 == 'Pass' 替换为 'Fail + error message' 2. 否则附加额外的失败。我没有看到如何在我当前的代码结构中立即实现,但认为如果我将每次检查的结果写入单独的列然后合并,它可能会起作用。如果有,明天会在这里发布。 以上对我不起作用,因为我没有检查数据框中的所有列。我从另一个数据框中获取要检查的列列表。有没有办法将列标题列表输入到您的代码中?

以上是关于检查文本列中的数值 - python的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL 如图A列中的文本数据,如果包含B列的任一数值,则显示红字。

Excel 查找某列中的数值有没有在另一列中出现

python 检查所有列中的缺失值

Pandas: 如何将一列中的文本拆分为多行? | Python

根据两列中的文本拆分行(Python,Pandas)

python 检查缺失值的百分比和df列中的孔的趋势以及它们是否连续。