Pandas如何将Starring列的2/3词格式演员名拆分到独立列
Pandas拆分Starring列生成独立演员列方案
之前尝试的字符串加逗号、通用正则替换失效,核心是没有匹配到演员姓名的明确边界规则。以下方案完全基于给出的姓名格式特征实现,拆分准确率100%:
拆分规则依据
从样例数据可明确两个固定规则:
- 单个演员名仅包含2个空格分隔词(如
Kim Jaewon)、3个空格分隔词(如Choi Kang hee)两种格式,无更长或更短的姓名 - 3词格式的演员名,最后一个词首字母为小写;2词格式的所有词首字母均为大写
完整实现代码
import pandas as pd def split_starring(s): s = s.strip() # 处理标记为none的空值行 if s == 'none': return [] tokens = s.split() actor_list = [] pos = 0 total_tokens = len(tokens) while pos < total_tokens: # 判定为3词演员:当前位置后第2个词存在,且首字母为小写 if pos + 2 < total_tokens and tokens[pos+2][0].islower(): actor_list.append(' '.join(tokens[pos:pos+3])) pos += 3 # 否则为2词演员 else: actor_list.append(' '.join(tokens[pos:pos+2])) pos += 2 return actor_list # 对Starring列执行拆分 actor_col = df['Starring'].apply(split_starring) # 将拆分后的列表展开为独立列,缺失位置填充none actor_df = pd.DataFrame(actor_col.tolist()).fillna('none') # 按规则重命名列 actor_df.columns = [f'Actor_{i+1}' for i in range(actor_df.shape[1])] # 合并回原DataFrame,删除原Starring列 df = pd.concat([df.drop(columns=['Starring']), actor_df], axis=1)
输出效果
对样例数据执行后,输出完全符合预期:
| Actor_1 | Actor_2 | Actor_3 | Actor_4 |
|---|---|---|---|
| Choi Kang hee | Kwon Sang woo | none | none |
| Kim Jun myeon | Ha Yeon soo | Oh Chang suk | Kim Ye won |
| Yoon Shi yoon | Cho Soo hyang | none | none |
| Kim Jaewon | Kim Ha neul | none | none |
| No Min woo | Hong Ah reum | none | none |
| Jang Hyuk | Lee Da hae | none | none |
该方案自动适配每行不同的演员数量,会根据全表最多演员数自动生成对应数量的Actor_N列,无需手动指定列数。
内容的提问来源于stack exchange,提问作者jaymerson
相关产品推荐
相关产品推荐

