为了账号安全,请及时绑定邮箱和手机立即绑定

如何拆分熊猫字符串以提取中间名?

如何拆分熊猫字符串以提取中间名?

翻翻过去那场雪 2021-09-28 21:20:19
您可以尝试格式文件:如果您在第二列上应用了引号... [csvfile] 包含 AAAAA,"B,BB",CCCCreate Table csvfile(f1 VarChar(10),f2 VarChar(10),f3 VarChar(10))BULK INSERT csvfile        FROM 'c:\downloads\sample.csv'        WITH (FORMATFILE = 'c:\downloads\sample.fmt'); 样本文件14.031       SQLCHAR             0       10      ",\""    1     f1       SQL_Latin1_General_CP1_CI_AS2       SQLCHAR             0       10      "\","    2     f2       SQL_Latin1_General_CP1_CI_AS3       SQLCHAR             0       10      "\r\n"   3     f3       SQL_Latin1_General_CP1_CI_AS分享
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

一个str.extract电话将在这里工作:


p = r'^(?P<Last_Name>.*), (?P<First_Name>\S+)\b\s*(?P<Middle_Name>.*)' 

u = df.loc[df.Type == "I", 'Complete_Name'].str.extract(p)

pd.concat([df, u], axis=1).fillna('')


   ID               Complete_Name Type     Last_Name First_Name   Middle_Name

0   1                  JERRY, Ben    I         JERRY        Ben              

1   2          VON HELSINKI, Olga    I  VON HELSINKI       Olga              

2   3  JENSEN, James Goodboy Dean    I        JENSEN      James  Goodboy Dean

3   4                 THE COMPANY    C                                       

4   5         CRUZ, Juan S. de la    I          CRUZ       Juan      S. de la

正则表达式分解


^                # Start-of-line

(?P<Last_Name>   # First named capture group - Last Name

    .*           # Match anything until...

)

,                # ...we see a comma

\s               # whitespace 

(?P<First_Name>  # Second capture group - First Name

    \S+          # Match all non-whitespace characters

)

\b               # Word boundary 

\s*              # Optional whitespace chars (mostly housekeeping) 

(?P<Middle_Name> # Third capture group - Zero of more middle names 

    .*           # Match everything till the end of string

)


查看完整回答
反对 回复 2021-09-28
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

我认为你可以这样做:


# take the complete_name column and split it multiple times

df2 = (df.loc[df['Type'].eq('I'),'Complete_Name'].str

       .split(',', expand=True)

       .fillna(''))


# remove extra spaces 

for x in df2.columns:

    df2[x] = [x.strip() for x in df2[x]]


# split the name on first space and join it

df2 = pd.concat([df2[0],df2[1].str.split(' ',1, expand=True)], axis=1)

df2.columns = ['last','first','middle']


# join the data frames

df = pd.concat([df[['ID','Complete_Name']], df2], axis=1)


# rearrange columns - not necessary though

df = df[['ID','Complete_Name','first','middle','last']]


# remove none values

df = df.replace([None], '')


   ID                  Complete_Name Type  first        middle          last

0   1   JERRY, Ben                      I    Ben                       JERRY

1   2   VON HELSINKI, Olga              I   Olga                VON HELSINKI

2   3   JENSEN, James Goodboy Dean      I  James  Goodboy Dean        JENSEN

3   4   THE COMPANY                     C                                   

4   5   CRUZ, Juan S. de la             I   Juan      S. de la          CRUZ


查看完整回答
反对 回复 2021-09-28
?
MM们

TA贡献1886条经验 获得超2个赞

这是使用一些简单的 lambda 功能的另一个答案。


import numpy as np

import pandas as pd



""" Create data and data frame """


info_dict = {

    'ID': [1,2,3,4,5,],

    'Complete_Name':[

        'JERRY, Ben',

        'VON HELSINKI, Olga',

        'JENSEN, James Goodboy Dean',

        'THE COMPANY',

        'CRUZ, Juan S. de la',

        ],

    'Type':['I','I','I','C','I',],

    }


data = pd.DataFrame(info_dict, columns = info_dict.keys())



""" List of columns to add """

name_cols = [

    'First Name',

    'Middle Name',

    'Last Name',

    ]


"""

Use partition() to separate first and middle names into Pandas series.

Note: data[data['Type'] == 'I']['Complete_Name'] will allow us to target only the

values that we want.

"""

NO_LAST_NAMES = data[data['Type'] == 'I']['Complete_Name'].apply(lambda x: str(x).partition(',')[2].strip())

LAST_NAMES = data[data['Type'] == 'I']['Complete_Name'].apply(lambda x: str(x).partition(',')[0].strip())


# We can use index positions to quickly add columns to the dataframe.

# The partition() function will keep the delimited value in the 1 index, so we'll use

# the 0 and 2 index positions for first and middle names.

data[name_cols[0]] = NO_LAST_NAMES.str.partition(' ')[0]

data[name_cols[1]] = NO_LAST_NAMES.str.partition(' ')[2]


# Finally, we'll add our Last Names column

data[name_cols[2]] = LAST_NAMES


# Optional: We can replace all blank values with numpy.NaN values using regular expressions.

data = data.replace(r'^$', np.NaN, regex=True)

然后你应该得到这样的结果:


   ID               Complete_Name Type First Name   Middle Name     Last Name

0   1                  JERRY, Ben    I        Ben           NaN         JERRY

1   2          VON HELSINKI, Olga    I       Olga           NaN  VON HELSINKI

2   3  JENSEN, James Goodboy Dean    I      James  Goodboy Dean        JENSEN

3   4                 THE COMPANY    C        NaN           NaN           NaN

4   5         CRUZ, Juan S. de la    I       Juan      S. de la          CRUZ

或者,用空字符串替换 NaN 值:


data = data.replace(np.NaN, r'', regex=False)

然后你有:


   ID               Complete_Name Type First Name   Middle Name     Last Name

0   1                  JERRY, Ben    I        Ben                       JERRY

1   2          VON HELSINKI, Olga    I       Olga                VON HELSINKI

2   3  JENSEN, James Goodboy Dean    I      James  Goodboy Dean        JENSEN

3   4                 THE COMPANY    C                                       

4   5         CRUZ, Juan S. de la    I       Juan      S. de la          CRUZ


查看完整回答
反对 回复 2021-09-28
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号