我已经完成了对csv文件的分割(下面给出了链接),下面给出了我的数据输出。在比较国家/地区列并仅返回仅在美国制作的电影名称时,我几乎不需要什么帮助。我该怎么办?
data = open("movie_metadata.csv", "r").read().split("\\n")
movie_data = [i.split(",") for i in data]
print(movie_data[1:4])
output:
[['movie_title','director_name','color','duration','actor_1_name','language',
'country','title_year'],
['Avatar','James Cameron','Color','178','CCH Pounder','English','USA',
'2009'],
["Pirates of the Caribbean: At World's End",'Gore Verbinski','Color',
'169','Johnny Depp','English','USA','2007'],
['Spectre','Sam Mendes','Color','148','Christoph Waltz','English','UK',
'2015']]
答案 0 :(得分:2)
您要基于“国家/地区”列过滤列表。
us_movies = [movie for movie in movies if movie[6] == 'USA']
如果愿意,还可以将行转换为标题。
us_movie_titles = [movie[0] for movie in movies if movie[6] == 'USA']
如果您想要匹配谓词结果的相应列表,则可以使用:
is_match = [movie[6] == 'USA' for movie in movies]
请注意,前两个列表的大小可能小于原始列表,但是is_match的大小和顺序与原始列表相同。
要将布尔值添加到完整数据集:
movies_with_usa = [m[0] + [m[1]] for m in zip(movies, is_match)]
但是您真正拥有的是命名数据,因此它在字典或对象中可能更合适。另外,如果您正在读取csv文件,则csv阅读器是标准库的一部分。因此,对于更坚固的东西
import csv
def read_data(filename):
with open(filename) as f:
reader = csv.DictReader(f)
return [row for row in reader]
def match(record, field, value):
return record[field] == value
data = read_data("movie_metadata.csv")
us_movies = [record for record in data if match(record, 'country', 'USA')]
答案 1 :(得分:1)
您要使用pandas
数据框,然后可以根据列轻松过滤。
import pandas as pd
df = pd.DataFrame(movie_data[1:],columns = movie_data[0])
movie_title director_name color duration actor_1_name language country title_year
0 Avatar James Cameron Color 178 CCH Pounder English USA 2009
1 Pirates of the Caribbean: At World\'s End Gore Verbinski Color 169 Johnny Depp English USA 2007
2 Spectre Sam Mendes Color 148 Christoph Waltz English UK 2015
df[df.country == "USA"]
movie_title director_name color duration actor_1_name language country title_year
0 Avatar James Cameron Color 178 CCH Pounder English USA 2009
1 Pirates of the Caribbean: At World\'s End Gore Verbinski Color 169 Johnny Depp English USA 2007
答案 2 :(得分:1)
只需遍历所有电影并比较第7列:
made_usa = []
for l in movie_data:
if l[6] == 'USA':
made_usa.append(l)
print (made_usa)
要仅添加电影名称,只需执行以下操作:
made_usa = []
for l in movie_data:
if l[6] == 'USA':
made_usa.append(l[0])
print (made_usa)
要保存是否存在匹配项,可以使用如下字典:
made_usa = {}
for l in movie_data:
if l[6] == 'USA':
made_usa.update({l[0]: 'True'})
else:
made_usa.update({l[0]: 'False'})
print (made_usa)
此后,如果您想查看是否在美国采取了某些行动。您所需要做的就是,例如:
print(made_usa['Avatar'])
输出:
'True'
答案 3 :(得分:1)
您可能正在寻找一种不带任何第三方库(即仅标准库)的通用解决方案。我们开始:
def filter_by(csv_data, column_name, column_value):
indices = [i for i, name in enumerate(data[0]) if name == column_name]
if not indices:
return
index = indices[0]
for row in data[1:]:
if row[index] == column_value:
yield row
这是您的使用方式:
print(list(filter_by(movie_data, "country", "USA")))
这将输出(为清晰起见,我对其进行了格式化):
[
['Avatar', 'James Cameron', 'Color', '178', 'CCH Pounder', 'English', 'USA', '2009'],
["Pirates of the Caribbean: At World's End", 'Gore Verbinski', 'Color', '169', 'Johnny Depp', 'English', 'USA', '2007']
]