Python 是否通过从现有列中提取值来创建新列?

Python 是否通过从现有列中提取值来创建新列?,python,python-3.x,regex,pandas,Python,Python 3.x,Regex,Pandas,我在下面有一个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中,列名称如下: df_b: 预期产出: ID | Comm

我在下面有一个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中,列名称如下:

df_b:

预期产出:

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

谢谢

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

Ex:

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
输出:

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

立即提取写为
@
左侧的字符串(?如果您知道字符串总是以
@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函数中执行此操作,但需要一个更可读的e方法是在之后过滤掉它们:

df['name'][~df['name'].isin(df_b[column_name])] = ''
代码片段
df['name'].isin(df_b[column_name])
给我们一个二进制列,指示名称在其他数据帧中的行,因此为了使所有其他条目为空,我们使用
~
对其求反,以获得名称不在其他数据帧中的所有行,然后切片
df['name']
此新列指示我们要从中删除名称的所有行,并将它们设置为等于空字符串
'