【问题标题】:Creating new column by extracting value from existing column?通过从现有列中提取值来创建新列?
【发布时间】:2020-09-22 03:49:17
【问题描述】:

我在下面有一个 df_a,在下面的列中有文本值,

ID   | Comment              
2     @thomas what do you mean?
3     @Rob yes
4     @carol @3423 no way 
45    @13121 @Mike yes sir

如何创建一个新列,其名称在评论列中的 @ 符号之后?如果该名称存在于我的另一个名为 df_b 的 df 中,我只想创建该列,其中 column_name 如下所示:

df_b:

column_name
Mike
Rob
thomas
carol

预期输出:

ID   |         Comment               | name
    2     @thomas what do you mean?    thomas
    3     @Rob yes                     Rob
    4     @carol @3423 no way          carol
    45    @13121 @Mike yes sir         mike

谢谢!

【问题讨论】:

    标签: python python-3.x regex pandas


    【解决方案1】:

    使用正则表达式str.extract(r"@([A-Za-z]+)")

    例如:

    df['name'] = df['Comment'].str.extract(r"@([A-Za-z]+)")
    print(df)
    

    输出:

                         Comment    name
    0  @thomas what do you mean?  thomas
    1                   @Rob yes     Rob
    2        @carol @3423 no way   carol
    3       @13121 @Mike yes sir    Mike
    

    【讨论】:

      【解决方案2】:

      @的左边提取字符串,写成(?<=y)x 其中y =特殊字符@- \@ x = 任何字母 a-z 小写和大写 [A-Za-z]

      df['name']=df.comment.str.extract('((?<=\@)[A-Za-z]+)')
      
      
      
               comment              name
      0  @thomas what do you mean?  thomas
      1                  @Rob yes      Rob
      

      【讨论】:

        【解决方案3】:

        如果您知道您的字符串将始终以@name 开头,后跟一个空格,您可以使用s.split(' ')[0] 来获取字符串s 中第一个空格左侧的所有文本,并切断像这样的第一个字符:s.split(' ')[0][1:] 如果您不知道,只想找到字符串中的第一个 @name,您可以使用 str.find 函数找到第一个 @,以及它后面的第一个空格。

        要获得一个新的列,我会构建一个简单的函数,用lambda 完成上述操作,然后使用.apply

        df['name'] = df['comment'].apply(lambda s: s.split(' ')[0][1:])
        

        但是,如果名称不在您的其他数据框中,这并不能满足您没有名称列的要求。我假设你的意思是在这些情况下你想要一个空字符串作为你的条目,因为你不能真正拥有一个只存在于某些行的列。您可以直接在上面的 lambda 函数中执行此操作,但更易读的方法是稍后将它们过滤掉:

        df['name'][~df['name'].isin(df_b[column_name])] = ''
        

        sn-p df['name'].isin(df_b[column_name]) 为我们提供了一个二进制列,指示名称在另一个数据帧中的行,因此要使所有其他条目为空白,我们用 ~ 取反以获取所有行name 在另一个数据帧中是 not,然后使用这个新列对 df['name'] 进行切片,该列指示我们要从中删除名称的所有行,并将它们设置为等于空字符串 ''

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-13
          • 2020-01-24
          • 2017-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-02
          相关资源
          最近更新 更多