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

Posted

技术标签:

【中文标题】Pandas - 如果不存在分隔符,则使用默认值拆分列【英文标题】:Pandas - split columns with default values if no delimiter present 【发布时间】:2020-06-20 13:50:21 【问题描述】:

我有以下数据框,我试图根据空格将“名称”列拆分为名字和姓氏,但是对于某些名称没有分隔符,在这种情况下,我想取姓氏中的值并留空以名字命名。

一种可能的方法是遍历所有行并在每一行上使用 if-else 条件,但是如 this post 中所述。

“Pandas 中的迭代是一种反模式,只有在你用尽所有其他选项时才应该这样做。” 所以我正在寻找一种在 Pandas 中实现这一点的方法。 p>

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

【问题讨论】:

您使用的是哪个版本的熊猫?对我来说,代码似乎可以工作,但是所有内容都添加到 first_name 列中,只有最后两个有姓氏。 (熊猫版本 1.0.0) @ScootCork 我使用的是 1.0.4 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

使用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


【讨论】:

【参考方案3】:

使用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

【讨论】:

以上是关于Pandas - 如果不存在分隔符,则使用默认值拆分列的主要内容,如果未能解决你的问题,请参考以下文章

在 2 个分隔线之间操作多行(如果不存在则附加,否则替换)

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)

Python使用pandas保存csv文件:如果文件存在则只添加内容(append),如果无表则同时写入表头和内容(write)

如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值

pandas读数据出现struct.error

如果键不存在,则字典返回默认值[重复]