使用Python为指定CSV文件生成新字段的技术咨询
没问题!我来帮你搞定用Python给这个CSV文件添加新字段的需求。先看看你提供的原始CSV结构:
movieId;title;genres
1;Toy Story (1995);Adventure|Animation|Children|Comedy|Fantasy
2;Jumanji (1995);Adventure|Children|Fantasy
3;Grumpier Old Men (1995);Comedy|Romance
4;Waiting to Exhale (1995);Comedy|Drama|Romance
5;Father of the Bride Part II (1995);Comedy
6;Heat (1995);Action|Crime|Thriller
7;Sabrina (1995);Comedy|Romance
8;Tom and Huck (1995);Adventure|Children
9;Hate (Haine, La) (1995);Crime|Drama
10;Seven (a.k.a. Se7en) (1995);Mystery|Thriller
下面我提供两种常用方案,你可以根据自己的环境和需求选择:
方案一:使用Pandas处理(推荐,简洁高效)
Pandas是处理CSV这类表格数据的神器,代码量少且易读。首先确保你已经安装了pandas:
pip install pandas
然后编写处理代码:
import pandas as pd # 读取分号分隔的CSV文件 df = pd.read_csv('movies.csv', sep=';') # 1. 提取电影年份作为新字段 `release_year` # 通过正则匹配标题里括号中的四位数字 df['release_year'] = df['title'].str.extract(r'\((\d{4})\)', expand=False) # 2. 拆分genres为列表格式的新字段 `genre_list` df['genre_list'] = df['genres'].str.split('|') # 3. 添加布尔字段 `is_comedy`,标记影片是否属于喜剧类型 df['is_comedy'] = df['genres'].str.contains('Comedy', case=False) # 4. 自定义:统计影片的类型数量 `genre_count` df['genre_count'] = df['genre_list'].apply(len) # 将处理后的数据保存为新的CSV文件(保持分号分隔) df.to_csv('movies_with_new_fields.csv', sep=';', index=False) # 打印前5行预览效果 print(df.head())
运行后你会得到包含新字段的CSV,比如release_year提取出了1995,is_comedy会显示True/False,非常直观。
方案二:使用Python标准库csv处理(无需额外依赖)
如果你不想安装第三方库,用Python内置的csv模块也能实现同样的功能:
import csv import re # 打开原始文件和输出文件 with open('movies.csv', 'r', encoding='utf-8') as infile, open('movies_with_new_fields.csv', 'w', newline='', encoding='utf-8') as outfile: # 按分号分隔读取数据为字典格式 reader = csv.DictReader(infile, delimiter=';') # 定义新的字段列表,在原有字段基础上添加新字段 fieldnames = reader.fieldnames + ['release_year', 'genre_list', 'is_comedy', 'genre_count'] writer = csv.DictWriter(outfile, fieldnames=fieldnames, delimiter=';') # 写入表头 writer.writeheader() # 逐行处理数据 for row in reader: # 提取年份:匹配标题中的四位数字年份 year_match = re.search(r'\((\d{4})\)', row['title']) row['release_year'] = year_match.group(1) if year_match else None # 拆分类型为逗号分隔的字符串(CSV中存储列表不太友好,用逗号替代竖线) genre_list = row['genres'].split('|') row['genre_list'] = ', '.join(genre_list) # 标记是否为喜剧 row['is_comedy'] = 'True' if 'Comedy' in genre_list else 'False' # 统计类型数量 row['genre_count'] = str(len(genre_list)) # 写入处理后的行 writer.writerow(row)
这个方案不需要安装任何额外包,适合环境受限的场景。
自定义扩展提示
你可以根据自己的需求修改新字段逻辑,比如:
- 提取电影原名(去掉年份和括号):
df['movie_name'] = df['title'].str.replace(r'\s*\(\d{4}\)', '', regex=True) - 添加
is_action字段标记动作片:df['is_action'] = df['genres'].str.contains('Action') - 合并多个类型为自定义分类,比如把包含
Children的标记为family_friendly
内容的提问来源于stack exchange,提问作者P.ru

