Python 3.9.5/Pandas 1.1.3
我一直在使用Pandas从csv文件创建JSON文件- JSON文件中的关键名称是从csv文件中的头名称生成的。我遇到了一个问题,我必须使用相同的密钥名称不止一次(内部嵌套的对象),但我不能有两个标题在csv文件具有相同的名称。
的例子:
到目前为止,我的csv文件有4列:id
,data
,type
,location
。我需要一个JSON对象文件(包括一个嵌套对象),并使用以下代码完成:
import pandas as pd
import json
import os
csv = "/Users/me/file.csv"
csv_file = pd.read_csv(csv, sep=",", header=0, index_col=False)
csv_file['org'] = csv_file[['data', 'type']].apply(lambda s: s.to_dict(), axis=1)
csv_file[['id', 'org']].to_json("file.json", orient="records", lines=True, date_format="iso", double_precision=10, force_ascii=True, date_unit="ms", default_handler=None)
假设我在csv文件中有一行数据,值分别为1
,ABC
,XYZ
和123
,上面的代码将创建一个json文件与这个对象:
{
"id":1,
"org":{
"data":"ABC",
"type":"XYZ"
},
"location":"123"
}
但是今天我收到了一个新的csv文件,有6列-和上面一样的4列,加上两个新的列,叫做data1
和type1
,代表org_2
。我需要在JSON文件中的键名为这些值也data
和type
,但我不能命名的列在csv文件,b/c已经有这些名称的列。
1
,ABC
,XYZ
,123
,Foo
和Bar
在创建的文件中的JSON对象看起来像这样:
{
"id":1,
"org":{
"data":"ABC",
"type":"XYZ"
},
"location":"123",
"org_2":{
"data":"Foo",
"type":"Bar"
}
}
所以像这样:
csv = "/Users/me/file.csv"
csv_file = pd.read_csv(csv, sep=",", header=0, index_col=False)
csv_file['org'] = csv_file[['data', 'type']].apply(lambda s: s.to_dict(), axis=1)
csv_file['org_2'] = csv_file[['data1', 'type1']].apply(lambda s: s.to_dict(), axis=1)
csv_file[['id', 'org', 'org_2']].to_json("file.json", orient="records", lines=True, date_format="iso", double_precision=10, force_ascii=True, date_unit="ms", default_handler=None)
除了上面当然要创建名为data1
和type1
的密钥,而我只需要它们是data
和type
。
您需要在应用前重命名列:
csv_file['org_2'] = csv_file[['data1', 'type1']].set_axis(['data', 'type'], axis=1).apply(lambda s: s.to_dict(), axis=1)
我们可以使用rename函数返回一个新的数据框,其中包含重命名的列,并对其应用lambda函数。
csv = "/Users/me/file.csv"
csv_file = pd.read_csv(csv, sep=",", header=0, index_col=False)
csv_file['org'] = csv_file[['data', 'type']].apply(lambda s: s.to_dict(), axis=1)
csv_file['org_2'] = csv_file[['data1', 'type1']].rename(['data1' : 'data', 'type1':'type']).apply(lambda s: s.to_dict(), axis=1)
csv_file[['id', 'org', 'org_2']].to_json("file.json", orient="records", lines=True, date_format="iso", double_precision=10, force_ascii=True, date_unit="ms", default_handler=None)