如何使用熊猫查找特定列具有十进制数字的行?

时间:2019-08-13 12:40:36

标签: python pandas data-quality

我正在使用pandas编写数据质量脚本,该脚本将检查每一列上的某些条件

此刻,我需要找出特定列中没有小数或实际数字的行。我可以找到数字(如果是整数),但是到目前为止,我所见过的方法isdigit() , isnumeric(), isdecimal()等都无法正确识别数字是十进制数的时间。例如:2.5、0.1245等。

以下是一些示例代码和数据:

>>> df = pd.DataFrame([
    [np.nan, 'foo', 0],
    [1, '', 1],
    [-1.387326, np.nan, 2],
    [0.814772, ' baz', ' '],     
    ["a", '      ', 4],
    ["  ",  'foo qux ', '  '],         
], columns='A B C'.split(),dtype=str)

>>> df
    A   B   C
0   NaN foo 0
1   1       1
2   -1.387326   NaN 2
3   0.814772    baz 
4   a       4
5       foo qux 

>>> df['A']
0          NaN
1            1
2    -1.387326
3     0.814772
4            a
5             
Name: A, dtype: object

以下方法都无法识别十进制数字

df['A'].fillna('').str.isdigit()
df['A'].fillna('').str.isnumeric()
df['A'].fillna('').str.isdecimal()

0    False
1     True
2    False
3    False
4    False
5    False
Name: A, dtype: bool

所以当我尝试以下内容时,我只会得到1行

>>> df[df['A'].fillna('').str.isdecimal()]
    A   B   C
1   1       1

注意:我正在使用dtype=str来获得与大熊猫解释/更改dtype值有关的数据。实际数据在A列中可能有空格,我将使用replace()对其进行裁剪,在这里我将代码保持简单,以免造成混淆。

2 个答案:

答案 0 :(得分:2)

to_numericerrors='coerce'一起用于NaN的非数值,然后通过Series.notna进行测试:

print (pd.to_numeric(df['A'], errors='coerce').notna())
0    False
1     True
2     True
3     True
4    False
5    False
Name: A, dtype: bool

如果需要返回True,以获取缺少的值:

print (pd.to_numeric(df['A'], errors='coerce').notna() | df['A'].isna())
0     True
1     True
2     True
3     True
4    False
5    False
Name: A, dtype: bool

具有自定义功能的另一种解决方案:

def test_numeric(x):
    try:
        float(x)
        return True
    except Exception:
        return False

print (df['A'].apply(test_numeric))
0     True
1     True
2     True
3     True
4    False
5    False
Name: A, dtype: bool

print (df['A'].fillna('').apply(test_numeric))
0    False
1     True
2     True
3     True
4    False
5    False
Name: A, dtype: bool

答案 1 :(得分:0)

另一种方法,如果要保留字符串结构,可以使用:

df['A'].str.contains('.')

0    False
1     True
2    False
3    False
4    False
5    False

在这种情况下,唯一的风险可能是您也标识带有.的单词。这不是您想要的