【问题标题】:Select rows from pandas DataFrame that contain a string starting with an integer从 pandas DataFrame 中选择包含以整数开头的字符串的行
【发布时间】:2019-10-13 22:40:41
【问题描述】:

我创建了一个包含一个字符串列的 pandas DataFrame。我想将它的一些行复制到第二个 DataFrame 中:只是第一个空格之前的字符是大于或等于 300 的整数的行,而第一个空格之后的字符是“Broadway”的行。在以下示例中,应仅复制第一行。

我宁愿解决这个问题,而不是简单地用 Python 编写布尔表达式。假设我想说服某人使用 pandas 而不是没有 pandas 的 Python 的好处。非常感谢。


d = {
    "address": [
        "300 Broadway",      #Ok.
        "300 Wall Street",   #Sorry, not "Broadway".
        "100-10 Broadway",   #Sorry, "100-10" is not an integer.
        "299 Broadway",      #Sorry, 299 is less than 300.
        "Broadway"           #Sorry, no space at all.
    ]
}

df = pd.DataFrame(d)
df2 = df[what goes here?]   #Broadway addresses greater than or equal to 300
print(df2)

【问题讨论】:

    标签: python string pandas dataframe search


    【解决方案1】:

    您可以使用str.containsstr.extractge

    # rows which contain broadway
    m1 = df['address'].str.contains('(?i)broadway')
    # extract the numbers from the string and check if they are greater of equal to 300
    m2 = df['address'].str.extract('(\d+)')[0].astype(float).ge(300)
    
    # get all the rows which have True for both conditions
    df[m1&m2]
    

    输出

            address
    0  300 Broadway
    

    【讨论】:

      【解决方案2】:

      我认为最好先清理一下数据,例如:

      # prepare data
      df[['number', 'street']] = df.address.str.split('\s+', n=1, expand=True)
      df['number'] = pd.to_numeric(df.number, errors='coerce')
      

      第一行将地址拆分为数字和街道,第二行将数字转换为实际整数,注意那些不是整数的值将转换为NaN。然后你可以这样做:

      # create mask to filter
      mask = df.number.ge(300) & df.street.str.contains("Broadway")
      print(df[mask])
      

      基本上创建一个布尔掩码,其中数字大于或等于 300 并且街道百老汇。综上所述,您有:

      # prepare data
      df[['number', 'street']] = df.address.str.split('\s+', n=1, expand=True)
      df['number'] = pd.to_numeric(df.number, errors='coerce')
      
      # create mask to filter
      mask = df.number.eq(300) & df.street.str.contains("Broadway")
      print(df[mask])
      

      输出

              address  number    street
      0  300 Broadway   300.0  Broadway
      

      请注意,此解决方案假定您的数据具有以下模式:Number Street

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 2012-07-14
        • 2018-03-01
        相关资源
        最近更新 更多