Python 如何重塑嵌套JSON输出的数据帧
我开始处理一些数据操作,我需要在旧文件的基础上创建一个新文件(具有新功能)。然而,在使用“.to_json”方法之前,我不知道如何定制自己的数据帧 例如,我将.csv作为:Python 如何重塑嵌套JSON输出的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我开始处理一些数据操作,我需要在旧文件的基础上创建一个新文件(具有新功能)。然而,在使用“.to_json”方法之前,我不知道如何定制自己的数据帧 例如,我将.csv作为: seller, customer, product, price Roger, Will, 8129, 30 Roger, Markus, 1234, 100 Roger, Will, 2334, 50 Mike, Markus, 2295, 20 Mike, Albert, 1234, 100 …我想生成一个.json文
seller, customer, product, price
Roger, Will, 8129, 30
Roger, Markus, 1234, 100
Roger, Will, 2334, 50
Mike, Markus, 2295, 20
Mike, Albert, 1234, 100
…我想生成一个.json文件,以支持我从中可视化网络。这应该大致类似于:
{
"node": [
{"id":"Roger", "group": "seller" },
{"id":"Mike", "group": "seller" },
{"id":"Will", "group": "customer" },
{"id":"Markus", "group": "customer" },
{"id":"Albert", "group": "customer" }
],
"links":[
{"source":"Roger","target":"Will","product":8129,"price":30},
#...and so on
]
}
我试着做一些类似的事情:
df1 = pd.read_csv('file.csv')
seller_list = df1.seller.unique()
customer_list = df1.customer.unique()
…而且我确实可以得到带有独特项目的列表。但是,我找不到如何将它们添加到数据帧中,以便创建如下结构:
"node":[
...
{"id":"Mike", "group": "seller" },
{"id":"Markus", "group": "customer" },
...
]...#see above
对此的任何支持或提示都将不胜感激。这将是一个两步流程。首先,使用
melt
+drop\u duplicates
+创建节点
dict
-
nodes = df[['customer', 'seller']]\
.melt(var_name='group', value_name='id')\
.drop_duplicates()\
.to_dict('r')
现在,使用重命名+到
links = df.rename(columns={'seller' : 'source', 'customer' : 'target'}).to_dict('r')
现在,将数据合并到一个字典中,并将其作为JSON转储到一个文件中
data = {'nodes' : nodes, 'links' : links}
with open('data.json', 'w') as f:
json.dump(data, f, indent=4)
您的data.json
文件应该如下所示-
{
"nodes": [
{
"id": "Will",
"group": "customer"
},
{
"id": "Markus",
"group": "customer"
},
{
"id": "Albert",
"group": "customer"
},
{
"id": "Roger",
"group": "seller"
},
{
"id": "Mike",
"group": "seller"
}
],
"links": [
{
"product": 8129,
"target": "Will",
"source": "Roger",
"price": 30
},
{
"product": 1234,
"target": "Markus",
"source": "Roger",
"price": 100
},
{
"product": 2334,
"target": "Will",
"source": "Roger",
"price": 50
},
{
"product": 2295,
"target": "Markus",
"source": "Mike",
"price": 20
},
{
"product": 1234,
"target": "Albert",
"source": "Mike",
"price": 100
}
]
}
这将是一个分两步的过程。首先,使用melt
+drop\u duplicates
+创建节点
dict
-
nodes = df[['customer', 'seller']]\
.melt(var_name='group', value_name='id')\
.drop_duplicates()\
.to_dict('r')
现在,使用重命名+到
links = df.rename(columns={'seller' : 'source', 'customer' : 'target'}).to_dict('r')
现在,将数据合并到一个字典中,并将其作为JSON转储到一个文件中
data = {'nodes' : nodes, 'links' : links}
with open('data.json', 'w') as f:
json.dump(data, f, indent=4)
您的data.json
文件应该如下所示-
{
"nodes": [
{
"id": "Will",
"group": "customer"
},
{
"id": "Markus",
"group": "customer"
},
{
"id": "Albert",
"group": "customer"
},
{
"id": "Roger",
"group": "seller"
},
{
"id": "Mike",
"group": "seller"
}
],
"links": [
{
"product": 8129,
"target": "Will",
"source": "Roger",
"price": 30
},
{
"product": 1234,
"target": "Markus",
"source": "Roger",
"price": 100
},
{
"product": 2334,
"target": "Will",
"source": "Roger",
"price": 50
},
{
"product": 2295,
"target": "Markus",
"source": "Mike",
"price": 20
},
{
"product": 1234,
"target": "Albert",
"source": "Mike",
"price": 100
}
]
}
你好,COLDSPEED,你的答案看起来很棒!谢谢!!如果可能的话,我想再问你一个小问题。如果我想从“链接”的一半中排除一个维度,该怎么办。例如,排除“产品”,只留下“目标”、“来源”和“价格”。我可以用什么方法来降低这个维度?@Rogerameidalete在计算链接之前,做:df=df.drop(“产品”,1)你好,COLDSPEED,你的答案看起来很棒!谢谢!!如果可能的话,我想再问你一个小问题。如果我想从“链接”的一半中排除一个维度,该怎么办。例如,排除“产品”,只留下“目标”、“来源”和“价格”。我可以使用什么方法来降低这个维度?@rogerameidalete在计算链接之前,do:df=df.drop(“产品”,1)