检查文本列中的数值 - 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列的任一数值,则显示红字。