【问题标题】:How do I read a csv file as json, then reading it as a list and remove selected list?如何将 csv 文件读取为 json,然后将其读取为列表并删除选定列表?
【发布时间】:2021-06-29 13:06:54
【问题描述】:

我目前正在测试如何分析包含大量数据(如 30000 条记录)的大型 CSV 文件 下图是我想提取“动画”、“戏剧”、“喜剧”等词的栏目的一部分。

我建议的步骤如下:

  1. 打开 CSV 文件并将其读取为 json?以便数据保存在列表中?
  2. 使用 for 循环遍历整个列(我不确定这部分)
  3. 删除列表?或提取措辞?

以下是 2 列,还有更多列,但我想先尝试提取单词。

样本数据:

[{'id': 16, 'name': 'Animation'}, {'id': 35, 'name': 'Comedy'}, {'id': 10751, 'name': 'Family'}]
[{'id': 12, 'name': 'Adventure'}, {'id': 14, 'name': 'Fantasy'}, {'id': 10751, 'name': 'Family'}]
[{'id': 10749, 'name': 'Romance'}, {'id': 35, 'name': 'Comedy'}]
[{'id': 35, 'name': 'Comedy'}, {'id': 18, 'name': 'Drama'}, {'id': 10749, 'name': 'Romance'}]
[{'id': 35, 'name': 'Comedy'}]
[{'id': 28, 'name': 'Action'}, {'id': 80, 'name': 'Crime'}, {'id': 18, 'name': 'Drama'}, {'id': 53, 'name': 'Thriller'}]
[{'id': 28, 'name': 'Action'}, {'id': 80, 'name': 'Crime'}, {'id': 18, 'name': 'Drama'}, {'id': 53, 'name': 'Thriller'}]
[{'id': 28, 'name': 'Action'}, {'id': 80, 'name': 'Crime'}, {'id': 18, 'name': 'Drama'}, {'id': 53, 'name': 'Thriller'}]
[{'id': 35, 'name': 'Comedy'}, {'id': 10749, 'name': 'Romance'}]
[{'id': 28, 'name': 'Action'}, {'id': 12, 'name': 'Adventure'}, {'id': 18, 'name': 'Drama'}, {'id': 10751, 'name': 'Family'}]```

【问题讨论】:

  • 您好,能否请您发布您目前编写的代码并复制粘贴部分数据。所以有人可以重现你的问题。
  • "打开 csv 文件并以 json 格式读取?"这没有任何意义。
  • 据我所知,您的 csv 不是 csv。它看起来像一个 json-lines 格式,但有一个标题,所以不是真正的 json-lines。但是如果你扔掉标题,它可能是 json-lines。什么创建了这个文件?
  • 我其实是从 kaggle 下载了这个文件,然后从 IMDB 中抓取了电影数据,然后将它们合并到一个文件中。
  • 对不起,我是编码新手,所以我不知道如何实现这个..

标签: python json pandas list csv


【解决方案1】:

您的方法是正确的,但我会说它不会那么有效,而是您可以优化您的源以以适当的方式提供文件。

试试下面的代码,希望对你有帮助。

import ast, json
import pandas as pd
from csv import reader
file_name = 'test_file.csv'
data = []
with open(file_name, 'r') as read_obj:
    csv_reader = reader(read_obj)
    headings = next(csv_reader)
    for row in csv_reader:
        data.extend(ast.literal_eval(row[0]))

df = pd.DataFrame(data)
out_df = df[df['name'].str.contains("Animation|Drama|Comedy")]
print(out_df)

我希望你可以从那里继续。

【讨论】:

  • 你好,代码在for循环部分对我有用,但是我想知道如果我想再添加一列,这是唯一键,我应该添加什么编码给它?
  • 它会产生类似的结果
  • 名称 0 动画 1 喜剧 2 家庭 3 冒险 4 奇幻 ... 40060 剧情 40061 惊悚
  • 但我应该如何将它堆叠起来(例如 0 动画 1 喜剧 2 家庭,应该在同一行)但现在它们在 3 行中
【解决方案2】:

Pandas 是分析大型 csv 的一种快速/强大的方法。可能有更快的方法,但您可以尝试以下方法:

import pandas as pd

main_col = 'genres'
sub_cols = ['name','id']
search_str = 'ANIMATION'

# read csv as pandas dataframe, using only the columns you care about, e.g. 'Genre'
df_csv = pd.read_csv(filename,usecols=[main_col])

movies = {}
# iterate over all rows
for index,row in df_csv.iterrows():
    # evaluate the string as a list of dicts
    row_as_list = eval(row)

    for dictionary in row_as_list:
        val = dictionary[subCols[0]]
        key = dictionary[subCols[1]]

        # filter for only the results you want
        if search_str in movie_name.upper():
            movies[key] = val

这会给你一个看起来像这样的字典:

movies = {
    '1': 'Movie1',
    '2': 'Movie2'
}

这是解决您的问题的有效解决方案,但如果您以更合理的方式将数据存储在 csv 中,即每行只有一个 name:id 对,您可以使用 pandas 获得更快、更清洁的方法。

【讨论】:

  • 谢谢!我会试试看。但我只是想知道我是否必须指定要提取的流派列,我是否需要一个 for 循环来遍历整个“流派”列?
  • 修复了我的帖子中的一个错误,目前的编辑显示了一个工作示例。循环本质上是内置的,因此 df.loc 返回一个数据框,其中包含满足条件的所有选定行(在此示例中,字符串“动画”位于“名称”列中)。我的示例中的最后一行打印了一个数据框;如果将其保存到变量“df2”中,则可以通过说 list(df2['names']) 将所有名称提取到列表中
  • 好的,我正在更仔细地查看示例,我误解了它们是如何存储在 csv 中的。我会调整我的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2015-02-28
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多