【问题标题】:How to extract status in full name in pd.Dataframe column?如何在 pd.Dataframe 列中提取全名状态?
【发布时间】:2021-12-01 06:44:22
【问题描述】:

我有数据集。这是“名称”列:

 0                                Braund, Mr. Owen Harris
1      Cumings, Mrs. John Bradley (Florence Briggs Th...
2                                 Heikkinen, Miss. Laina
3           Futrelle, Mrs. Jacques Heath (Lily May Peel)
4                               Allen, Mr. William Henry
                             ...                        
151                    Pears, Mrs. Thomas (Edith Wearne)
152                                     Meo, Mr. Alfonzo
153                      van Billiard, Mr. Austin Blyler
154                                Olsen, Mr. Ole Martin
155                          Williams, Mr. Charles Duane

并且需要提取名字、状态和第二个名字。当我在简单的字符串上尝试这个时,没关系:

full_name="Braund, Mr. Owen Harris"
first_name=full_name.split(',')[0]
second_name=full_name.split('.')[1]
print('First name:',first_name) 
print('Second name:',second_name)
status = full_name.replace(first_name, '').replace(',','').split('.')[0]
print('Status:',status)

>First name: Braund
>Second name:  Owen Harris
>Status:  Mr

但在尝试使用 pandas 执行此操作后,我因状态失败:

df['first_Name'] = df['Name'].str.split(',').str.get(0) #its ok, worsk well

但是在这之后:

status= df['Name'].str.replace(df['first_Name'], '').replace(',','').split('.').str.get(0)

我弄错了:

>>TypeError: 'Series' objects are mutable, thus they cannot be hashed

有哪些可能的解决方案?

编辑:感谢您的回答并提取列。我愿意

def extract_name_data(row):
    
    row.str.extract('(?P<first_name>[^,]+), (?P<status>\w+.) (?P<second_name>[^(]+\w) ?')  
    last_name = row['second_name'] 
    title = row['status']     
    first_name = row['first_name'] 
    return first_name, second_name, status

得到

AttributeError: 'str' object has no attribute 'str'

可以做什么?行的意思是 df['Name']

【问题讨论】:

    标签: python pandas string dataframe replace


    【解决方案1】:

    您可以将str.extractnamed capturing groups 一起使用:

    df['Name'].str.extract('(?P<first_name>[^,]+), (?P<status>\w+.) (?P<second_name>[^(]+\w) ?')
    

    输出:

         first_name status    second_name
    0        Braund    Mr.    Owen Harris
    1       Cumings   Mrs.   John Bradley
    2     Heikkinen  Miss.          Laina
    3      Futrelle   Mrs.  Jacques Heath
    4         Allen    Mr.  William Henry
    5         Pears   Mrs.         Thomas
    6           Meo    Mr.        Alfonzo
    7  van Billiard    Mr.  Austin Blyler
    8         Olsen    Mr.     Ole Martin
    9      Williams    Mr.  Charles Duane
    

    【讨论】:

    • 哇,太棒了
    • @mozway 谢谢!你能回答编辑过的问题还是我应该提出一个新问题?
    • @NikitaTsekhanovich 不清楚你想做什么,为什么要一个函数?您不应该逐行应用事物。正如我向您展示的那样,这是最有效的,您可以直接获得包含所有信息的完整数据框。请提供预期的输出。
    • @mozway 任务启动器还需要另一种解决方案作为函数,其中相同的数据框是输入(可能行是一个坏名字)。输出 - 那些列:second_name、status、first_name
    • 任务启动器?对不起,我没有得到你想要的。如果你想要单独的行,要么对行进行子集化并应用相同的东西,要么像我展示的那样提取整个数据帧并迭代输出的行
    【解决方案2】:

    您也可以将原始代码稍加修改后放入 Pandas .apply() 函数中使其工作,如下所示:

    只需将 Python 中的变量名替换为 Pandas 中的列名即可。 例如,在.apply()函数的lambda函数中将full_name替换为x['Name'],将first_name替换为x['first_Name']

    df['status'] = df.apply(lambda x: x['Name'].replace(x['first_Name'], '').replace(',','').split('.')[0], axis=1)
    

    虽然可能不是最有效的方法,但它可以轻松地将 Python 中的现有代码修改为 Pandas 中的可用版本。

    结果:

    print(df)
    
    
                                                      Name    first_Name status
    0                              Braund, Mr. Owen Harris        Braund     Mr
    1    Cumings, Mrs. John Bradley (Florence Briggs Th...       Cumings    Mrs
    2                               Heikkinen, Miss. Laina     Heikkinen   Miss
    3         Futrelle, Mrs. Jacques Heath (Lily May Peel)      Futrelle    Mrs
    4                             Allen, Mr. William Henry         Allen     Mr
    151                  Pears, Mrs. Thomas (Edith Wearne)         Pears    Mrs
    152                                   Meo, Mr. Alfonzo           Meo     Mr
    153                    van Billiard, Mr. Austin Blyler  van Billiard     Mr
    154                              Olsen, Mr. Ole Martin         Olsen     Mr
    155                        Williams, Mr. Charles Duane      Williams     Mr
    

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2020-11-08
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多