假设我有一个包含如下名称的 Pandas DataFrame:
name_df = pd.DataFrame({'name':['Jack Fine','Kim Q. Danger','Jane Smith', 'Juan de la Cruz']})
name
0 Jack Fine
1 Kim Q. Danger
2 Jane Smith
3 Juan de la Cruz
Run Code Online (Sandbox Code Playgroud)
我想分裂name柱成first_name和last_name是否有在名称中有一个空格。否则,我希望将全名推入first_name.
所以最终的 DataFrame 应该是这样的:
first_name last_name
0 Jack Fine
1 Kim Q. Danger
2 Jane Smith
3 Juan de la Cruz
Run Code Online (Sandbox Code Playgroud)
我试图通过首先应用以下函数来返回可以拆分为名字和姓氏的名称来实现此目的:
def validate_single_space_name(name: str) -> str:
pattern = re.compile(r'^.*( ){1}.*$')
match_obj = re.match(pattern, name)
if match_obj:
return name
else:
return None
Run Code Online (Sandbox Code Playgroud)
但是,将此函数应用于我原来的 name_df 会导致一个空的 DataFrame,而不是由可以拆分的名称和 Nones 填充的 DataFrame。
帮助我当前的工作方法,或涉及不同方法的解决方案将不胜感激!
您可以使用str.split拆分字符串,然后使用测试拆分的数量str.len并将其用作布尔掩码以仅分配具有拆分的最后一个组件的那些行:
In [33]:
df.loc[df['name'].str.split().str.len() == 2, 'last name'] = df['name'].str.split().str[-1]
df
Out[33]:
name last name
0 Jack Fine Fine
1 Kim Q. Danger NaN
2 Jane Smith Smith
3 Juan de la Cruz NaN
Run Code Online (Sandbox Code Playgroud)
编辑
您可以split使用 param调用expand=True这只会填充名称长度恰好为 2 个名称的位置:
In [16]:
name_df[['first_name','last_name']] = name_df['name'].loc[name_df['name'].str.split().str.len() == 2].str.split(expand=True)
name_df
Out[16]:
name first_name last_name
0 Jack Fine Jack Fine
1 Kim Q. Danger NaN NaN
2 Jane Smith Jane Smith
3 Juan de la Cruz NaN NaN
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用fillna以下命令替换缺少的名字:
In [17]:
name_df['first_name'].fillna(name_df['name'],inplace=True)
name_df
?
Out[17]:
name first_name last_name
0 Jack Fine Jack Fine
1 Kim Q. Danger Kim Q. Danger NaN
2 Jane Smith Jane Smith
3 Juan de la Cruz Juan de la Cruz NaN
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13150 次 |
| 最近记录: |