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 - 如果不存在分隔符,则使用默认值拆分列的主要内容,如果未能解决你的问题,请参考以下文章
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)
Python使用pandas保存csv文件:如果文件存在则只添加内容(append),如果无表则同时写入表头和内容(write)