Pandas - 如果不存在分隔符,则使用默认值拆分列

Pandas - split columns with default values if no delimiter present

我有下面的数据框,我试图在 space 的基础上将 'name' 列拆分为 first_name 和 last_name 但是对于某些名称没有分隔符在这种情况下,我想取姓氏的值并在名字中留空。

一种可能的方法是遍历所有行并对每一行使用 if-else 条件,但是如 this post.

中所述

“Pandas 中的迭代是一种反模式,只有在用尽所有其他选项时才应该这样做。” 所以我正在寻找一个在 Pandas.

中实现此目的的方法
names_df = pd.read_csv(io.BytesIO(obj['Body'].read()))
print(names_df)
names_df[['first_name', 'last_name']] = names_df['name'].str.split(' ', expand=True)
print(names_df)
ValueError: Columns must be same length as key
order_id      name        product_id  product_price
    0        Thanos         Ipad        800
    1        Hulk           AC          400
    2        C America      Ipad        760
    3        Black Panther  IPhone      1100

预期数据帧:

first_name   last_name   
              Thanos
              Hulk
   C          America
  Black       Panther

使用 Series.str.extract 以及命名的正则表达式捕获组从名称列中提取名字和姓氏:

df1 = names_df['name'].str.extract(r'(?P<First_Name>\w+)\s(?P<Last_Name>\w+)')
df1['Last_Name'] = df1['Last_Name'].fillna(names_df['name'])

# print(df1)
  First_Name Last_Name
0        NaN    Thanos
1        NaN      Hulk
2          C   America
3      Black   Panther

首先拆分然后使用str[::-1]

反转内部列表
df[['last_name','first_name']] = df.name.str.split().str[::-1].apply(pd.Series).fillna('')

df
            name last_name first_name
0         Thanos    Thanos        
1           Hulk      Hulk        
2      C America   America          C
3  Black Panther   Panther      Black


这是我想出的解决方案,不确定它是否是最佳解决方案,但它确实有效

df = pd.DataFrame({'name': ['Thanos', 'Hulk', 'Black Panther', 'C Amarica']})                                    

def split_name(name): 
    split_name = name.split(' ') 
    return split_name if len(split_name) == 2 else ['', split_name[0]]

pd.DataFrame(df.name.apply(split_name).tolist(), columns=['first_name', 'last_name'])

  first_name last_name
0               Thanos
1                 Hulk
2      Black   Panther
3          C   Amarica