要基于指定的流派列表分割数据,可以使用 布尔索引 或 groupby
结合筛选。以下是具体方法:
场景假设
- 数据列
genres
中的值可能是多流派的字符串,例如"drama,action"
或["drama", "action"]
。 - 目标:根据给定的流派列表
['drama', 'action', 'thriller', 'european']
,提取每个流派对应的所有电影数据。
方法 1:布尔索引(推荐)
直接筛选包含指定流派的记录,即使一条数据属于多个流派也会被重复计入不同分组。
步骤
-
预处理流派列(确保格式统一):
python# 将 genres 转换为小写,并拆分成列表(假设原数据用逗号分隔) combined_data['genres'] = combined_data['genres'].str.lower().str.split(',')
-
定义目标流派列表:
pythontarget_genres = ['drama', 'action', 'thriller', 'european']
-
创建字典存储各流派数据:
pythongenre_dict = {} for genre in target_genres: # 生成布尔掩码:检查每条记录的 genres 是否包含当前流派 mask = combined_data['genres'].apply(lambda x: genre in x) genre_dict[genre] = combined_data[mask]
验证结果
python
# 查看 action 流派的数据量
print(f"Action 电影数量: {len(genre_dict['action'])}")
# 查看前 2 个流派的数据
for genre in list(genre_dict.keys())[:2]:
print(f"=== {genre.upper()} ===")
print(genre_dict[genre].head(2))
方法 2:使用 groupby
+ 筛选
若 genres
是单一标签(非多标签),可以直接分组:
步骤
-
预处理为单一流派(如无多标签):
python# 如果存在多标签,取第一个流派作为主标签(根据需求调整) combined_data['main_genre'] = combined_data['genres'].str.split(',').str[0]
-
分组并提取目标流派:
pythontarget_genres = ['drama', 'action', 'thriller', 'european'] grouped = combined_data.groupby('main_genre') genre_dict = {genre: grouped.get_group(genre) for genre in target_genres if genre in grouped.groups}
输出示例
假设原始数据片段:
Title | genres |
---|---|
Movie A | drama,action |
Movie B | thriller |
Movie C | european,drama |
执行方法 1 后,genre_dict['drama']
将包含:
Title | genres |
---|---|
Movie A | ['drama', 'action'] |
Movie C | ['european', 'drama'] |
注意事项
-
大小写敏感:预处理时统一转换为小写(或大写)。
-
多标签分隔符 :确保正确拆分原数据中的分隔符(如
,
、|
等)。 -
空值处理 :检查并处理
genres
列中的缺失值:pythoncombined_data = combined_data.dropna(subset=['genres'])
完整代码示例
python
import pandas as pd
# 假设数据格式
data = {
'Title': ['Movie A', 'Movie B', 'Movie C', 'Movie D'],
'genres': ['Drama,Action', 'Thriller', 'European,Drama', 'Comedy']
}
combined_data = pd.DataFrame(data)
# 预处理:转为小写并拆分成列表
combined_data['genres'] = combined_data['genres'].str.lower().str.split(',')
# 目标流派列表
target_genres = ['drama', 'action', 'thriller', 'european']
# 创建字典存储各流派数据
genre_dict = {}
for genre in target_genres:
mask = combined_data['genres'].apply(lambda x: genre in x)
genre_dict[genre] = combined_data[mask]
# 查看结果
for genre, df in genre_dict.items():
print(f"\n=== {genre.upper()} 流派 ({len(df)} 部电影) ===")
print(df[['Title', 'genres']])
输出结果
=== DRAMA 流派 (2 部电影) ===
Title genres
0 Movie A [drama, action]
2 Movie C [european, drama]
=== ACTION 流派 (1 部电影) ===
Title genres
0 Movie A [drama, action]
=== THRILLER 流派 (1 部电影) ===
Title genres
1 Movie B [thriller]
=== EUROPEAN 流派 (1 部电影) ===
Title genres
2 Movie C [european, drama]