Csv到json由相同的python键

Csv到json由相同的python键,python,json,pandas,csv,dictionary,Python,Json,Pandas,Csv,Dictionary,我有一个大的csv文件(aprx.1GB),我想通过以下方式将其转换为json文件: csv文件具有以下结构: 标题:tid;因基;出类拔萃;值 价值观: tid1;inkey1;outkey1;value1 tid1;inkey2;outkey2;value2 tid2;inkey2;outkey3;value2 tid2;inkey4;outkey3;value2 等等 其想法是将此csv转换为具有以下结构的json,基本上按“tid”对所有内容进行分组: 我可以想象如何使用普通的pyth

我有一个大的csv文件(aprx.1GB),我想通过以下方式将其转换为json文件:

csv文件具有以下结构:

标题:
tid;因基;出类拔萃;值

价值观:

tid1;inkey1;outkey1;value1
tid1;inkey2;outkey2;value2
tid2;inkey2;outkey3;value2
tid2;inkey4;outkey3;value2
等等

其想法是将此csv转换为具有以下结构的json,基本上按“tid”对所有内容进行分组:


我可以想象如何使用普通的python命令和列表来完成这项工作,但我的问题也是必须处理大量数据。我想熊猫可以帮上忙,但我对这个工具还是很困惑

首先,您需要使用
pandas
并将csv读入数据框。假设csv保存在名为
my_file.csv的文件中,然后调用

import pandas as pd    
my_df = pd.read_csv('my_file.csv')
然后需要将此数据帧转换为指定的格式。下面的调用将它转换为具有指定结构的dict

my_json = dict(my_df.set_index('tid1').groupby(level=0).apply(lambda  x : x.to_json(orient = 'records')))
现在,如果需要,可以将其导出到
json
文件中

import json
with open('my_json.json', 'w') as outfile:
    json.dump(my_json, outfile)

我认为,对于标准Python数据结构,如
defaultdict
,这应该是直截了当的。除非您的内存非常有限,否则我看不出1gb文件使用直接方法会有问题的原因

类似于(未测试):


也许有一种更快或更节省内存的方法来处理Pandas或其他产品,但简单性和零依赖性还有很长的路要走

您可以将熊猫与
groupby
和字典理解一起使用:

from io import StringIO
import pandas as pd

mystr = StringIO("""tid1;inkey1;outkey1;value1
tid1;inkey2;outkey2;value2
tid2;inkey2;outkey3;value2
tid2;inkey4;outkey3;value2""")

# replace mystr with 'file.csv'
df = pd.read_csv(mystr, sep=';', header=None, names=['tid1', 'inkeys', 'outkeys'])

# group by index
grouper = df.groupby(level=0)

# nested dictionary comprehension with selected columns
res = {k: {col: v[col].tolist() for col in ('inkeys', 'outkeys')} for k, v in grouper}

print(res)

{'tid1': {'inkeys': ['outkey1', 'outkey2'], 'outkeys': ['value1', 'value2']},
 'tid2': {'inkeys': ['outkey3', 'outkey3'], 'outkeys': ['value2', 'value2']}}

类似于另一个
defaultdict()
答案:

from collections import defaultdict

d = defaultdict(lambda: defaultdict(list))

with open('file.txt') as in_file:
    for line in in_file:
        tid, inkey, outkey, value = line.strip().split(';')
        d[tid]['inkeys'].append(inkey)
        d[tid]['outkeys'].append(outkey)
        d[tid]['values'].append(value)

1gb不是很大。您是否确实遇到了性能问题?对我来说,这听起来不像是熊猫的工作。到目前为止你做了什么?你在一个小csv上写了一些代码吗?我们可以帮助您优化代码/理解错误,但您必须自己做一些工作!提示:尝试在python字典中创建相同的结构,这应该是一项简单的任务。
tid
值是否已“分组”-即,您是否可以确定,一旦在文件中从
tid1
转到
tid2
,将不再出现
tid1
?如果是这种情况,您只需逐行读取文件,编写一个dict,并在
tid
更改后附加到JSON。
from io import StringIO
import pandas as pd

mystr = StringIO("""tid1;inkey1;outkey1;value1
tid1;inkey2;outkey2;value2
tid2;inkey2;outkey3;value2
tid2;inkey4;outkey3;value2""")

# replace mystr with 'file.csv'
df = pd.read_csv(mystr, sep=';', header=None, names=['tid1', 'inkeys', 'outkeys'])

# group by index
grouper = df.groupby(level=0)

# nested dictionary comprehension with selected columns
res = {k: {col: v[col].tolist() for col in ('inkeys', 'outkeys')} for k, v in grouper}

print(res)

{'tid1': {'inkeys': ['outkey1', 'outkey2'], 'outkeys': ['value1', 'value2']},
 'tid2': {'inkeys': ['outkey3', 'outkey3'], 'outkeys': ['value2', 'value2']}}
from collections import defaultdict

d = defaultdict(lambda: defaultdict(list))

with open('file.txt') as in_file:
    for line in in_file:
        tid, inkey, outkey, value = line.strip().split(';')
        d[tid]['inkeys'].append(inkey)
        d[tid]['outkeys'].append(outkey)
        d[tid]['values'].append(value)