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
我有下面的数据框,我试图在 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