从具有重复键名的Pandas的csv文件中创建JSON对象



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,XYZ123,上面的代码将创建一个json文件与这个对象:

{
"id":1,
"org":{
"data":"ABC",
"type":"XYZ"
},
"location":"123"
}

但是今天我收到了一个新的csv文件,有6列-和上面一样的4列,加上两个新的列,叫做data1type1,代表org_2。我需要在JSON文件中的键名为这些值也datatype,但我不能命名的列在csv文件,b/c已经有这些名称的列。

所以我需要的是,假设6列值是1,ABC,XYZ,123,FooBar在创建的文件中的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)

除了上面当然要创建名为data1type1的密钥,而我只需要它们是datatype

您需要在应用前重命名列:

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)

相关内容

  • 没有找到相关文章

最新更新