在我的pandas程序中,我正在阅读csv并将一些列转换为json
例如:我的csv是这样的:
id_4 col1 col2 .....................................col100
1 43 56 .....................................67
2 46 67 ....................................78
我想要实现的目标是:
id_4 json
1 {"col1":43,"col2":56,.....................,"col100":67}
2 {"col1":46,"col2":67,.....................,"col100":78}
我尝试过的代码如下:
df = pd.read_csv('file.csv')
def func(df):
d = [
dict([
(colname, row[i])
for i,colname in enumerate(df[['col1','col2',............,'col100']])
for row in zip(df['col1'].astype(str),df['col2'].astype(str),...............,df['col100'].astype(str))]
format_data = json.dumps(d)
format_data = format_data[1:len(format_data)-1]
json_data = '{"key":'+format_data+'}'
result.append(pd.Series([df['id_4'].unique()[0],json_data],index = headers))
return df
df.groupby('id_4').apply(func)
b = open('output.csv', 'w')
writer = csv.writer(b)
writer.writerow(headers)
writer.writerows(result[1:len(result)])
CSV包含大约100 000个数据,内存为(15 MB)。当我执行此操作时,经过很长一段时间后,该过程将自动终止。我认为这是一个记忆问题。
因为我是这个python和pandas的新手,有没有办法优化上面的代码才能正常工作或增加内存是唯一的方法。
我正在使用5GB RAM Linux系统。
编辑:
df = pd.read_csv('Vill_inter.csv')
with open('output.csv', 'w') as f:
writer = csv.writer(f)
for id_4, row in itertools.izip(df.index.values, df.to_dict(orient='records')):
writer.writerow((id_4, json.dumps(row))
答案 0 :(得分:2)
Pandas数据框可以使用to_json
方法直接在JSON中进行序列化。
您的输出格式不是很清楚,但请看一下:
# Generate dataframe
df = pd.DataFrame(np.random.randn(5, 100), columns=['col' + str(n) for n in xrange(1, 101)])
# Create id_4 column
df.index += 1
df.index.name = 'id_4'
# Reindex df to have the column id_4 in the output, remove if you only columns1 to X
df.reset_index(drop=False, inplace=True)
# Dump data to disk, or buffer
path = 'out.json'
df.to_json(path, orient='records')
它会比你的循环快得多,并且可能会解决你的错误。
编辑:
显然输出应该是自定义文件格式。在这种情况下,您可以使用to_dict(orient='records)
输出数据框。输出将是一个列表,其中每个元素将一行表示为字典。您可以使用dumps
模块(内置)的json
函数序列化字典。
这样的事情:
import json
import itertools
with open('output.csv', 'w') as f:
writer = csv.writer(f)
for id, row in itertools.izip(df.index.values, df.to_dict(orient='records')):
writer.writerow((id, json.dumps(row)))