Csv到json由相同的python键
我有一个大的csv文件(aprx.1GB),我想通过以下方式将其转换为json文件: csv文件具有以下结构: 标题: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
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)