在列pandas python中获取非数字行

时间:2017-05-23 16:37:00

标签: python pandas

我查了这篇文章:finding non-numeric rows in dataframe in pandas? 但它并没有真正回答我的问题。

我的样本数据:

import pandas as pd


d = {
 'unit': ['UD', 'UD', 'UD', 'UD', 'UD','UD'],
 'N-D': [ 'Q1', 'Q2', 'Q3', 'Q4','Q5','Q6'],
 'num' : [ -1.48, 1.7, -6.18, 0.25, 'sum(d)', 0.25]

}
df = pd.DataFrame(d)

它看起来像这样:

  N-D   num   unit
0  Q1  -1.48   UD
1  Q2   1.70   UD
2  Q3  -6.18   UD
3  Q4   0.25   UD
4  Q5   sum(d) UD
5  Q6   0.25   UD

我只想过滤掉列' num'中的行。这是非数字的。我希望所有列仅用于包含列' num'的非数字值的行。

期望的输出:

  N-D   num   unit
4  Q5   sum(d) UD

我的尝试:

nonnumeric=df[~df.applymap(np.isreal).all(1)] #didn't work, it pulled out everything, besides i want the condition to check only column 'num'. 

nonnumeric=df['num'][~df.applymap(np.isreal).all(1)] #didn't work, it pulled out all the rows for column 'num' only.

5 个答案:

答案 0 :(得分:7)

使用boolean indexing + to_numeric创建的面具isnull 注意:此解决方案未找到或过滤保存为字符串的数字:例如“1”或“22”

print (pd.to_numeric(df['num'], errors='coerce'))
0   -1.48
1    1.70
2   -6.18
3    0.25
4     NaN
5    0.25
Name: num, dtype: float64

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

print (df[pd.to_numeric(df['num'], errors='coerce').isnull()])
  N-D     num unit
4  Q5  sum(d)   UD

isinstanceapply的另一种解决方案:

print (df[df['num'].apply(lambda x: isinstance(x, str))])
  N-D     num unit
4  Q5  sum(d)   UD

答案 1 :(得分:4)

旧话题,但是如果数字已转换为'str',则 type(x)== str 不起作用。

相反,最好使用isnumeric()或isdigit()。

df = df[df['num'].apply(lambda x: not x.isnumeric())]

我假设自己的数据帧已通过pd.read_csv()转换为“ str”,并在具有200k +行的数据帧上测试了这三种方法。

def f1():
    df[pd.to_numeric(df['num'], errors='coerce').isnull()]

def f2():
    df[~df.num.str.match('^\-?(\d*\.?\d+|\d+\.?\d*)$')]

def f3():
    df[df['num'].apply(lambda x: not x.isnumeric())]

我通过运行每个函数10次来跟踪执行时间。

timeit.timeit(f1, number=10)
1.04128568888882

timeit.timeit(f2, number=10)
1.959099448888992

timeit.timeit(f3, number=10)
0.48741375999998127

对策: 最快方法是isnumeric(),最慢​​是正则表达式方法。

答案 2 :(得分:3)

我用过

df = df[df['num'].apply(lambda x: type(x) == str)]

现在df是

  N-D     num unit
4  Q5  sum(d)   UD

答案 3 :(得分:2)

假设这些是字符串,您可以根据浮点数的正则表达式匹配进行过滤。

class Window(QtGui.QMainWindow):
  def __init__(self):
    super(Window, self).__init__()
    self.tabs()

  def home(self):
    df = QtGui.QPushButton('hello', self)
    df.show()

  def series(self):
    df = QtGui.QCheckBox('hello', self)
    df.show()   

  def tabs(self):
    btn_home = QtGui.QPushButton(QtGui.QIcon('home.png'), 'Home', self)
    btn_home.clicked.connect(self.home)

    btn_series = QtGui.QPushButton(QtGui.QIcon('series.png'),'Series', self)
    btn_series.clicked.connect(self.series)

    self.show()

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

if __name__ == '__main__': run()

答案 4 :(得分:0)

在pandas DataFrame列中有很多检测非数字值的方法,这是一种。

df[~df['num'].map(lambda x:x.isnumeric())]