【问题标题】:Regular expression in python 2.7 to identify any non numeric symbol in a column in dataframepython 2.7中的正则表达式用于识别数据框中列中的任何非数字符号
【发布时间】:2015-07-31 09:32:22
【问题描述】:

我正在用 python 清理数据。数据框中的某些列应该是数字的。但是这些列中有一些行包含可能是 ?、/ 或任何其他非数字符号的字符串。如果所选列的值不是数字,我想创建一个等于 1 的布尔列,否则为 0。我是 python 新手,我不确定非值的正则表达式是什么。 我需要提到的一件事是,由于 c 列包含非数值,它被读取为对象,而不是字符串或数字。 样本输入

      a     b   c   d
  1  10    20  30   40
  2  10/20 30   ?    50

此输入被读取为 dataframe ,称为 df。 理想输出

      a     b   c   d    e
  1  10    20  30   40   0
  2  10/20 30   ?    50  1

【问题讨论】:

  • edit您的问题并包括示例输入、所需输出和您尝试过的代码。有用吗?
  • 好的。但是现在列e 表示 在列c 中包含一个非数字值。这就是你想要的吗?
  • 是的。它可以是这些列中的任何一个。我只是想看看哪一行有非数值,所以我可以手动清理它。
  • 你有负数吗?

标签: python regex python-2.7


【解决方案1】:

这是一个朋友给我的建议。我们可以讨论哪个更好。

    df2[df2.Year.str.contains("[^-0-9\/]+")]

【讨论】:

    【解决方案2】:

    不是熊猫专家,但您可以做以下事情:

    import pandas as pd
    
    
    df = pd.read_csv("in.csv", delimiter="\s+")
    
    df['e'] = df.applymap(lambda x: str(x).isdigit()).T.all().astype(int)
    

    输入:

    a  b  c  d
    10 20 30 40
    10/20 30 ? 50
    3 4 5 6
    

    输出:

           a   b   c   d  e
    0     10  20  30  40  1
    1  10/20  30   ?  50  0
    2      3   4   5   6  1
    

    如果您在行中没有混合类型,您可以这样做:

    df['e'] = df.applymap(np.isreal).T.all().astype(int)
    

    分解:

     print(df.applymap(lambda x: str(x).isdigit()))
    

    根据是否为数字为每个行元素输出 True 或 False:

           a     b      c     d     e
    0   True  True   True  True  True
    1  False  True  False  True  True
    2   True  True   True  True  True
    

    然后我们用.T转置:

    print(df.applymap(lambda x: str(x).isdigit()).T)
    

    获取:

          0      1     2
    a  True  False  True
    b  True   True  True
    c  True  False  True
    d  True   True  True
    e  True   True  True
    

    如果每一行的所有元素都为真,.all 返回真:

    0     True
    1    False
    2     True
    dtype: bool
    

    最后 .astype(int) 输出:

    0    1
    1    0
    2    1
    dtype: int64
    

    我们用它来创建新的 col e

    这只有在你有正数时才有效。

    【讨论】:

    • 我假设当您使用 x 时,它只是列的名称?
    • @YanSong,它将行中的每个元素转换为字符串并检查它是否是数字。
    • @YanSong,你想对非数字行做什么?
    • 视具体情况而定。这是手动输入的数据。所以有点棘手
    • 好吧,这将适用于您的问题中的输入,我认为正则表达式不会更有用
    【解决方案3】:

    如果你想使用正则表达式来检查非数字..你可以使用以下:

    ^[^0-9]+$
    

    相当于下面的简写符号:

    ^\D+$
    

    代码:

    import re
    matchObj = re.match( r'^\D+$', myStr)   //put your column
                                            // value in myStr
    if matchObj:
       print "Match found!", matchObj.group()
    else:
       print "No match!!"
    

    【讨论】:

    • 我正在学习python。能不能写出更完整的代码
    • @karthik 使用 \D+ 来突出显示 10/20 的情况不是更好吗?
    • @karthikmanchala 谢谢。不过这是不理想的。上面列出了我的理想输出。
    • @YanSong 我的回答应该让您了解如何解决您的问题...我相信您可以使用它编写自己的逻辑..
    • @karthikmanchala 这不是一个好的答案。这就是我要说的。
    【解决方案4】:

    我假设该列是str,而不是int。您可以使用正则表达式,但如果您只对字符串使用 isdigit() 方法,它会更快且更容易理解。

    例如:

    >>> '1233456'.isdigit()
    True
    >>> '1234aaaa'.isdigit()
    False
    >>> '1234@'.isdigit()
    False
    >>> '123,456,789'.isdigit()
    False
    

    此方法返回一个布尔值 (True/False),然后您可以将其插入所需的列中。

    【讨论】:

    • 我是 python 新手。如果我错了,请纠正我。我没有找到 isdigit() 作为数据框列的属性。我做了 df.a.isdigit() 。它没有工作
    • 除非数字是负数,否则这是行不通的
    • @YanSong isdigit()string 的属性,所以如果你可以从数据框的列中提取string(我假设你需要这样做才能使用regex ),您可以在提取的数据上使用isdigit()
    • 没有。我没有负数。我正在使用 ipython 笔记本。所以我在 df.a 之后使用制表符。 .我没有发现 isdigit() 作为它的属性之一。
    • @PadraicCunningham,我假设只有正数,我希望正则表达式会提到这一点,而且它很重要。即使是这种情况,您也可以检查“-”并将其从字符串中取出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2013-01-06
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多