我有一个包含两列的 DataFrame。一列包含字符串值,这些值可能包含也可能不包含数字(整数或 float )。
示例:
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
列中的条目具有字符串数据类型。但是,它们的值可能是数字,也可能不是数字。
我想要得到什么:
查找哪些行在
value
列中具有数值。从数据集中删除其他行。
最终结果如下:
name value
'B' 10
'D' 10
'F' 20.0
'G' 25.1
我尝试使用 isnumeric()
函数,但它仅针对整数(而不是 float )返回 True
。
如果您有任何解决此问题的想法,请告诉我。
更新的问题(多列):
(当有多于一列包含数值时,同样的问题)
同样,我有一个包含三列的 DataFrame。两列包含字符串值,这些值可能包含也可能不包含数字(整数或 float )。
示例:
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'])
列value1
和value2
中的条目具有字符串数据类型。但是,它们的值可能是数字,也可能不是数字。
我想要得到什么:
查找哪些行在
value1
和value2
列中具有数值。从数据集中删除其他行。
最终结果如下:
name value1 value2
'B' 10 15
'D' 10 15
'G' 25.1 30.1
最佳答案
您可以使用pandas.to_numeric
与 errors='coerce'
,然后 dropna
删除无效行:
(data_df.assign(value=pd.to_numeric(data_df['value'], errors='coerce'))
.dropna(subset=['value'])
)
注意。这会将整数向上转换为 float ,但这就是 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]
关于python - 如何在 Pandas DataFrame 中查找包含数字的字符串数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70681047/