如何在 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
中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。
我想得到的:
找出哪些行在第 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'])
列 value1
和 value2
中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。
我想得到的:
查找哪些行在 value1
& value2
列中有数值。
从数据集中删除其他行。
最终结果如下:
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]
我有一个包含两列的 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
中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。
我想得到的:
找出哪些行在第
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'])
列 value1
和 value2
中的条目具有字符串数据类型。但是,它们的值可能是数字也可能不是。
我想得到的:
查找哪些行在
value1
&value2
列中有数值。从数据集中删除其他行。
最终结果如下:
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]