对应列表数据的分割和分组

要基于指定的流派列表分割数据,可以使用 布尔索引 或 groupby 结合筛选。以下是具体方法:


场景假设

  • 数据列 genres 中的值可能是多流派的字符串,例如 "drama,action" 或 ["drama", "action"]。
  • 目标:根据给定的流派列表 ['drama', 'action', 'thriller', 'european'],提取每个流派对应的所有电影数据。

方法 1:布尔索引(推荐)

直接筛选包含指定流派的记录,即使一条数据属于多个流派也会被重复计入不同分组。

步骤
  1. 预处理流派列(确保格式统一):

    python 复制代码
    # 将 genres 转换为小写,并拆分成列表(假设原数据用逗号分隔)
    combined_data['genres'] = combined_data['genres'].str.lower().str.split(',')
  2. 定义目标流派列表:

    python 复制代码
    target_genres = ['drama', 'action', 'thriller', 'european']
  3. 创建字典存储各流派数据:

    python 复制代码
    genre_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 是单一标签(非多标签),可以直接分组:

步骤
  1. 预处理为单一流派(如无多标签):

    python 复制代码
    # 如果存在多标签,取第一个流派作为主标签(根据需求调整)
    combined_data['main_genre'] = combined_data['genres'].str.split(',').str[0]
  2. 分组并提取目标流派:

    python 复制代码
    target_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'

注意事项

  1. 大小写敏感:预处理时统一转换为小写(或大写)。

  2. 多标签分隔符 :确保正确拆分原数据中的分隔符(如 ,、| 等)。

  3. 空值处理 :检查并处理 genres 列中的缺失值:

    python 复制代码
    combined_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]
相关推荐
Y3815326628 分钟前
印度电商数据采集教程:用 SerpBase 查 Flipkart/Myntra/Ajio 商品(附代码)
数据库·python
阿维的博客日记34 分钟前
大白话解析快排Python
python
doujiaozh1 小时前
我在 DOS 6.22 上跑通了 Kimi AI:一场跨越 40 年的硬核接力
python
凛铄linshuo1 小时前
分析业务流程什么时候适合断言?
python·pytest
import_random1 小时前
[python]IDE可以自动检测venv工具创建的虚拟环境.venv吗
python
楠风测开2 小时前
Python学习路线:搭好环境,跑通第一个脚本
python
code2cat2 小时前
【随笔】RAG重排怎样挑证据:先扩大候选,再把相关片段排到前面
人工智能·python·大语言模型·rag
云和数据.ChenGuang2 小时前
python大小整数范围解析
java·开发语言·python
cpolar技术支持2 小时前
端口被谁占了、这台机上开了哪些监听?本机起一个端口占用只读清单,cpolar 给异地同事远程看谁在监听
运维·python·内网穿透·cpolar·端口占用
长坡夜行2 小时前
没有运维的交易系统,是怎么自己活下去的
python