【问题标题】:How to remove strings from Colum A from strings of Colum B如何从B列的字符串中删除A列的字符串
【发布时间】:2019-12-19 11:19:55
【问题描述】:

想知道如果您有两列(A = 'Name',B = 'Name_Age'),有没有一种快速的方法可以从 'Name_Age' 中删除 'Name' 以便您可以快速获取 'Age',就像一个反转级联??

我考虑过“字符串拆分”,但在某些情况下(当没有字符串拆分因素时)我确实需要一种方法来从另一列的字符串中删除一列的字符串。

#example data below:

import pandas as pd

data =  {'Name':['Mark','Matt','Michael'], 'Name_Age':['Mark 14','Matt 29','Michael 18']}

df = pd.DataFrame(data)

【问题讨论】:

    标签: python pandas substring concatenation


    【解决方案1】:

    您可以尝试使用 pandas apply 函数,它可以让您定义自己的函数以传递给数据帧的每一行:

    def age_from_name_age(name, name_age):
        return name_age.replace(name, '').strip()
    
    df['Age'] = df.apply(lambda x: age_from_name_age(x['Name'], x['Name_Age']),
                         axis='columns')
    

    age_from_name_age 接受两个字符串(一个名字和一个名字_年龄),只返回年龄。然后,在 apply 语句中,我定义了一个匿名 lambda 函数,它只接受一行并将正确的字段传递给 age_from_name_age

    【讨论】:

      【解决方案2】:

      使用字符串切片:

      df['Age'] = df.apply(lambda row: row['Name_Age'][len(row['Name']):], axis=1).astype(int)
      

      【讨论】:

      • 这是 lambda +1 的不错解决方案
      【解决方案3】:

      您可以使用str.split() 将值与使用空格分隔符的列名分开,然后用新名称重命名列。

      1) 使用str.split()

      >>> df['Name_Age'].str.split(" ", expand=True).rename(columns={0:'Name', 1:'Age'})
            Name Age
      0     Mark  14
      1     Matt  29
      2  Michael  18
      

      >>> df = df['Name_Age'].str.split(" ", expand=True).rename(columns={0:'Name', 1:'Age'})
      >>> df
            Name Age
      0     Mark  14
      1     Matt  29
      2  Michael  18
      

      或者,通过将拆分后的列表转换为新的数据框:

      >>> pd.DataFrame(df.Name_Age.str.split().tolist(), columns="Name Age".split())
            Name Age
      0     Mark  14
      1     Matt  29
      2  Michael  18
      

      2) 使用str.partition 的另一个选项

      >>> df['Name_Age'].str.partition(" ", True).rename(columns={0:'Name', 2:'Age'}).drop(1, axis=1)
            Name Age
      0     Mark  14
      1     Matt  29
      2  Michael  18
      

      3) 另一个使用df.assignlambda

      使用split() 和默认分隔符,如下所示,并使用新列Age 重新分配值。

      >>> df.assign(Age = df.Name_Age.apply(lambda x: x.split()[1]))
            Name    Name_Age Age
      0     Mark     Mark 14  14
      1     Matt     Matt 29  29
      2  Michael  Michael 18  18
      
      OR
      
      >>> df.Name_Age.apply(lambda x: pd.Series(str(x).split())).rename({0:"Name",1:"Age"}, axis=1)
            Name Age
      0     Mark  14
      1     Matt  29
      2  Michael  18
      

      【讨论】:

      • 这很好,这有助于我寻找splitrenamedf.assign 将创建原始 df 的副本?
      猜你喜欢
      • 2021-10-26
      • 2020-12-14
      • 2015-11-24
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2011-04-20
      相关资源
      最近更新 更多