【问题标题】:CSV column has list of lists. How do I turn this column into a relational database with sqlite?CSV 列有列表列表。如何使用 sqlite 将此列转换为关系数据库?
【发布时间】:2021-05-13 18:26:21
【问题描述】:

我对这一切都很陌生,似乎无法找到一种方法来完成这项工作。所以我有一个 JSON,我使用 python 转换为 CSV。我有 2 个问题。

第一个你也许能帮助我从概念上理解。当我使用 pandas 读取 JSON 文件时,我可以使用切片正确访问我的列表列表,如下所示:

这个“可发酵”列的第 1 行如下所示:

[[2.3810000000000002, 'American - Pale 2-Row', 37.0, 1.8, 44.7], [0.907, 'American - White Wheat', 40.0, 2.8, 17.0], [0.907, 'American - Pale 6-Row', 35.0, 1.8, 17.0], [0.227, 'Flaked Corn', 40.0, 0.5, 4.3], [0.227, 'American - Caramel / Crystal 20L', 35.0, 20.0, 4.3], [0.227, 'American - Carapils (Dextrine Malt)', 33.0, 1.8, 4.3], [0.113, 'Flaked Barley', 32.0, 2.2, 2.1], [0.34, 'Honey', 42.0, 2.0, 6.4]]

print(data['fermentables'][0]) 得到完全相同的列表 -

[[2.3810000000000002, 'American - Pale 2-Row', 37.0, 1.8, 44.7], [0.907, 'American - White Wheat', 40.0, 2.8, 17.0], [0.907, 'American - Pale 6-Row', 35.0, 1.8, 17.0], [0.227, 'Flaked Corn', 40.0, 0.5, 4.3], [0.227, 'American - Caramel / Crystal 20L', 35.0, 20.0, 4.3], [0.227, 'American - Carapils (Dextrine Malt)', 33.0, 1.8, 4.3], [0.113, 'Flaked Barley', 32.0, 2.2, 2.1], [0.34, 'Honey', 42.0, 2.0, 6.4]]

print(data['fermentables'][0][0]) 让我成为第一个列表 -

[2.3810000000000002, 'American - Pale 2-Row', 37.0, 1.8, 44.7]

print(data['fermentables'][0][0]) 得到我 [2.3810000000000002]

但是,当我尝试使用 pandas 访问 csv 做同样的事情时,我得到:

print(data['fermentables'][0])) = [[2.3810000000000002, 'American - Pale 2-Row', 37.0, 1.8, 44.7], [0.907, 'American - White Wheat', 40.0, 2.8, 17.0], [0.907, 'American - Pale 6-Row', 35.0, 1.8, 17.0], [0.227, 'Flaked Corn', 40.0, 0.5, 4.3], [0.227, 'American - Caramel / Crystal 20L', 35.0, 20.0, 4.3], [0.227, 'American - Carapils (Dextrine Malt)', 33.0, 1.8, 4.3], [0.113, 'Flaked Barley', 32.0, 2.2, 2.1], [0.34, 'Honey', 42.0, 2.0, 6.4]]

print((data['fermentables'][0][0]))= [

为什么我的列表不像我的 CSV 中的列表?


第二个问题,以及我想要完成的任务:

我将其转换为 CSV,以便将其导入 SQLite 数据库。还有几个列有像“发酵物”这样的列表,我非常想使用这些信息,但是我不知道让这些 SQLite 友好并将它们变成关系数据库(尤其是当我有列表时访问上面)。

如您所见,有多个列表,每个列表包含 5 个元素。这是 1 杯啤酒的整个“可发酵”配方,其中每个元素是“重量”、“谷物名称”、“ppg”、“deg_litner”、“谷物比尔”(我希望它们贴上标签,它们目前没有标签,但是这个是按该顺序排列的数据)。我试图把它变成我可以查询的东西,例如,所有啤酒配方中最常用的谷物名称。但事实上我不能那样做。可能我只是没有足够的经验来了解术语来询问谷歌或堆栈溢出以找到正确的答案,所以任何指导将不胜感激。

谢谢!

【问题讨论】:

  • 嘿,Basalty。我的第一个想法是使用像CREATE TABLE(id INTEGER PRIMARY KEY, weight REAL, grain_name TEXT, ppg REAL, deg_litner REAL, grain_bill REAL) 这样的表格。一个澄清的问题 - 是否有多个列表列表?例如数据的形状是否像[[[2.3810000000000002, 'American - Pale 2-Row', 37.0, 1.8, 44.7], ..., ], [[1.53, '1st Item In Second List of Lists', 32.0, 1.22, 43.7], ...], ...]?如果是这样,第一行和第二行有什么区别?每行是否包含特定类别的所有可发酵物?
  • 嗨,麦克斯!感谢您的帮助。是的,每一行都与下一行不同,因此它们的列表数量不同。对于使用的每种谷物,每一行都有几个测量值,因此可以有一个列表或多个列表。例如下一行只有 2 个列表: [[5.216, 'American - Pale 2-Row', 37.0, 1.8, 92.7], [0.41200000000000003, 'American - Caramel / Crystal 60L', 34.0, 60.0, 7.3]]]
  • 固体。你能澄清是什么导致它们被放在不同的行中。例如,第一排是拉格啤酒,第二排是黑啤,以此类推吗?
  • 每一行都是可发酵的啤酒配方,例如“香草波特”或“内华达山脉淡色艾尔克隆”

标签: python json pandas sqlite csv


【解决方案1】:

您可以使用与列表列表中的“叶节点”匹配的表。你可以在 sqlite 命令行 shell 中运行类似的东西:

CREATE TABLE fermentable(id INTEGER PRIMARY KEY, weight REAL, grain_name TEXT, ppg REAL, deg_litner REAL, grain_bill REAL);

然后用 python 脚本插入你的行:

import sqlite3

con = sqlite3.connect(<dbfilepath>,
    # turn off autocommit for better performance
    isolation_level=None
)
cur = con.cursor()
# turn off safety features to speed up the bulk insert
cur.execute("PRAGMA journal_mode=off;") 
cur.execute("PRAGMA synchronous=off;")
for fermentables in list_of_lists:
    for f in fermentables:
        con.execute("INSERT INTO fermentable VALUES(NULL, ?, ?, ?, ?, ?);", f)
cur.close()
con.close();

由于每个前导值具有相同的五个字段,您只需使用嵌套循环访问每个字段,然后运行正常插入。

【讨论】:

  • 哇,谢谢!我还没有机会尝试这个,但非常感谢你的帮助!!我真的很感激。
猜你喜欢
  • 2022-01-24
  • 2019-05-16
  • 2015-04-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多