如何在 Pandas DataFrame 中查找包含数字的字符串数据类型

How to find string data-type that includes a number in Pandas DataFrame

我有一个包含两列的 DataFrame。一列包含可能包含也可能不包含数字(整数或浮点数)的字符串值。

样本:

import pandas as pd
import numpy as np

data = [('A', '>10'),
        ('B', '10'),
        ('C', '<10'),
        ('D', '10'),
        ('E', '10-20'),
        ('F', '20.0'),
        ('G', '25.1') ]

data_df = pd.DataFrame(data, columns = ['name', 'value'])

value 中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。

我想得到的:

最终结果如下:

name    value    
'B'      10         
'D'      10 
'F'      20.0  
'G'      25.1       

我尝试使用 isnumeric() 函数,但它 returns True 仅适用于整数(不是浮点数)。

如果你有解决这个问题的想法,请告诉我。


更新问题(多列):

(数值不止一列时同题)

同样,我有一个包含三列的 DataFrame。两列包含可能包含也可能不包含数字(整数或浮点数)的字符串值。

样本:

import pandas as pd
import numpy as np

data = [('A', '>10', 'ABC'),
        ('B', '10', '15'),
        ('C', '<10', '>10'),
        ('D', '10', '15'),
        ('E', '10-20', '10-30'),
        ('F', '20.0', 'ABC'),
        ('G', '25.1', '30.1') ]

data_df = pd.DataFrame(data, columns = ['name', 'value1', 'value2'])

value1value2 中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。

我想得到的:

最终结果如下:

name    value1    value2
'B'      10         15
'D'      10         15 
'G'      25.1       30.1

您可以使用 pandas.to_numeric with errors='coerce', then dropna 删除无效行:

(data_df.assign(value=pd.to_numeric(data_df['value'], errors='coerce'))
        .dropna(subset=['value'])
)

注意。这会将整数向上转换为浮点数,但这是 Series 的工作方式并且向上转换比强制对象类型更好

输出:

  name  value
1    B   10.0
3    D   10.0
5    F   20.0
6    G   25.1

如果你只想对行进行切片并保持字符串类型:

data_df[pd.to_numeric(data_df['value'], errors='coerce').notna()]

输出:

  name value
1    B    10
3    D    10
5    F  20.0
6    G  25.1
更新问题(多列)

构建一个蒙版并在切片之前使用 any/all

mask = data_df[data_df.columns[1:]].apply(pd.to_numeric, errors='coerce').notna().all(1)
data_df[mask]