如何从列A的字符串中删除列B的字符串

2024-04-20 15:12:53 发布

您现在位置:Python中文网/ 问答频道 /正文

不知道你是否有两列(A='Name',B='Name\u Age'),有没有一种快速的方法从'Name\u 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)

Tags: 方法字符串nameimportpandasagedataexample
3条回答

使用字符串切片:

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

您可以使用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

您可以尝试使用pandasapply函数,该函数允许您定义自己的函数以传递给数据帧的每一行:

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。你知道吗

相关问题 更多 >