这个问题已经有了一些很好的答案,但是这里有一个很好的 sn-p,如果它们在某些列上有非数字值,我会经常使用它来删除行:
# Eliminate invalid data from dataframe (see Example below for more context)
num_df = (df.drop(data_columns, axis=1)
.join(df[data_columns].apply(pd.to_numeric, errors='coerce')))
num_df = num_df[num_df[data_columns].notnull().all(axis=1)]
这个工作的方式是我们首先drop来自df的所有data_columns,然后在将它们通过pd.to_numeric后使用join将它们放回原处(带有选项'coerce',这样所有非数字条目都将转换为NaN)。结果保存到num_df。
在第二行,我们使用了一个过滤器,它只保留所有值都不为空的行。
请注意,pd.to_numeric 将所有无法转换为数值的内容强制转换为 NaN,因此不会删除表示数值的字符串。例如'1.25' 将被识别为数值1.25。
免责声明:pd.to_numeric 在 pandas 版本中引入 0.17.0
示例:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({"item": ["a", "b", "c", "d", "e"],
...: "a": [1,2,3,"bad",5],
...: "b":[0.1,0.2,0.3,0.4,0.5]})
In [3]: df
Out[3]:
a b item
0 1 0.1 a
1 2 0.2 b
2 3 0.3 c
3 bad 0.4 d
4 5 0.5 e
In [4]: data_columns = ['a', 'b']
In [5]: num_df = (df
...: .drop(data_columns, axis=1)
...: .join(df[data_columns].apply(pd.to_numeric, errors='coerce')))
In [6]: num_df
Out[6]:
item a b
0 a 1 0.1
1 b 2 0.2
2 c 3 0.3
3 d NaN 0.4
4 e 5 0.5
In [7]: num_df[num_df[data_columns].notnull().all(axis=1)]
Out[7]:
item a b
0 a 1 0.1
1 b 2 0.2
2 c 3 0.3
4 e 5 0.5