[英]How to convert list of nested dicts (json) into a custom dataframe using pandas?
[英]How to convert Pandas DataFrame to custom nested JSON?
我是Pandas的新手,我正在嘗試將Pandas DataFrame轉換為自定義的嵌套JSON字符串(也許將其寫入文件)。 我試圖使用內置的Pandas to_json()
函數,但對我而言並不起作用。 我正在發布我的Pandas DF的一部分,並希望最終結果看起來像什么。 理想情況下,我希望使用DF索引的任意值填充“ id”鍵。 我認為我的目標是不必擔心列名是什么,而是有一種方法可以將DF轉換為JSON字符串。 我最初編寫了一個for循環,該循環將遍歷每一行並將內容寫入文件中,但是經過一番思考,我相信這將很容易出錯,因為大多數JSON序列化都是手動處理的。 任何幫助,將不勝感激。 感謝您,對不起您的帖子很長。
BarcodeSequence LinkerPrimerSequence BodySite Year Month Day Subject ReportedAntibioticUsage DaysSinceExperimentStart Description
#SampleID
L1S8 AGCTGACTAGTC GTGCCAGCMGCCGCGGTAA gut 2008.0 10.0 28.0 subject-1 Yes 0.0 subject-1.gut.2008-10-28
L1S57 ACACACTATGGC GTGCCAGCMGCCGCGGTAA gut 2009.0 1.0 20.0 subject-1 No 84.0 subject-1.gut.2009-1-20
L1S76 ACTACGTGTGGT GTGCCAGCMGCCGCGGTAA gut 2009.0 2.0 17.0 subject-1 No 112.0 subject-1.gut.2009-2-17
L1S105 AGTGCGATGCGT GTGCCAGCMGCCGCGGTAA gut 2009.0 3.0 17.0 subject-1 No 140.0 subject-1.gut.2009-3-17
L2S155 ACGATGCGACCA GTGCCAGCMGCCGCGGTAA left palm 2009.0 1.0 20.0 subject-1 No 84.0 subject-1.left-palm.2009-1-20
L2S175 AGCTATCCACGA GTGCCAGCMGCCGCGGTAA left palm 2009.0 2.0 17.0 subject-1 No 112.0 subject-1.left-palm.2009-2-17
L2S204 ATGCAGCTCAGT GTGCCAGCMGCCGCGGTAA left palm 2009.0 3.0 17.0 subject-1 No 140.0 subject-1.left-palm.2009-3-17
L2S222 CACGTGACATGT GTGCCAGCMGCCGCGGTAA left palm 2009.0 4.0 14.0 subject-1 No 168.0 subject-1.left-palm.2009-4-14
L3S242 ACAGTTGCGCGA GTGCCAGCMGCCGCGGTAA right palm 2008.0 10.0 28.0 subject-1 Yes 0.0 subject-1.right-palm.2008-10-28
L3S294 CACGACAGGCTA GTGCCAGCMGCCGCGGTAA right palm 2009.0
[
{
"id": "L1S8",
"metadata": {
"BarcodeSequence": "AGCTGACTAGTC",
"LinkerPrimerSequence": "GTGCCAGCMGCCGCGGTAA",
"BodySite": "gut",
"Year": 2008.0,
"Month": 10.0,
"Day": 28.0,
"Subject": "subject-1",
"ReportedAntibioticUsage": "Yes",
"DaysSinceExperimentStart": 0.0,
"Description": "subject-1.gut.2008-10-28"
},
"sample_frequency": "7068.0"
},
{
"id": "L1S57",
"metadata": {
"BarcodeSequence": "ACACACTATGGC",
"LinkerPrimerSequence": "GTGCCAGCMGCCGCGGTAA",
"BodySite": "gut",
"Year": 2009.0,
"Month": 1.0,
"Day": 20.0,
"Subject": "subject-1",
"ReportedAntibioticUsage": "No",
"DaysSinceExperimentStart": 84.0,
"Description": "subject-1.gut.2009-1-20"
},
"sample_frequency": "8756.0"
},
{
"id": "L1S76",
"metadata": {
"BarcodeSequence": "ACTACGTGTGGT",
"LinkerPrimerSequence": "GTGCCAGCMGCCGCGGTAA",
"BodySite": "gut",
"Year": 2009.0,
"Month": 2.0,
"Day": 17.0,
"Subject": "subject-1",
"ReportedAntibioticUsage": "No",
"DaysSinceExperimentStart": 112.0,
"Description": "subject-1.gut.2009-2-17"
},
"sample_frequency": "7922.0"
},
{
"id": "L1S105",
"metadata": {
"BarcodeSequence": "AGTGCGATGCGT",
"LinkerPrimerSequence": "GTGCCAGCMGCCGCGGTAA",
"BodySite": "gut",
"Year": 2009.0,
"Month": 3.0,
"Day": 17.0,
"Subject": "subject-1",
"ReportedAntibioticUsage": "No",
"DaysSinceExperimentStart": 140.0,
"Description": "subject-1.gut.2009-3-17"
},
"sample_frequency": "7865.0"
}
]
這是一種動態構建JSON(某種)的方法。 您仍然需要做一些假設,但我不確定您的用例是否會接受這些假設:
value
稱為, sample_frequency
將是示例數據框中的“值”列。 ìd
索引作為ìd
參數。 這可能會或可能不會。 可能是您也需要提前識別此列,在這種情況下,應使用.set_index()
將其設置為數據.set_index()
索引。 照這樣說:
import pandas as pd
import numpy as np
import json
data = pd.DataFrame(
{
'meta_1': np.random.choice(['A', 'B', 'C'], 10),
'meta_2': np.random.choice(['Blue', 'Green', 'Red'], 10),
'value': np.random.rand(10)
}
)
print(data)
數據如下:
meta_1 meta_2 value
0 A Red 0.095142
1 C Red 0.855082
2 C Blue 0.619704
3 B Green 0.371495
4 A Red 0.000771
5 B Green 0.027218
6 B Blue 0.655847
7 B Blue 0.657976
8 A Green 0.060862
9 C Red 0.702788
現在,將要使用的列設置為“值”列。
val_col_name = 'value'
然后是具有嵌套dict理解的列表理解:
json.dumps([{'id': i, 'metadata': {j: row[j] for j in data.columns if j != val_col_name}, val_col_name: row[val_col_name]} for i, row in data.iterrows()])
得到:
[{"id": 0, "metadata": {"meta_1": "B", "meta_2": "Red"}, "value": 0.3169439789955154}, {"id": 1, "metadata": {"meta_1": "C", "meta_2": "Green"}, "value": 0.5672345948633107}, {"id": 2, "metadata": {"meta_1": "B", "meta_2": "Red"}, "value": 0.36909249143056766}, {"id": 3, "metadata": {"meta_1": "C", "meta_2": "Red"}, "value": 0.8033913639248945}, {"id": 4, "metadata": {"meta_1": "B", "meta_2": "Red"}, "value": 0.04500655943447107}, {"id": 5, "metadata": {"meta_1": "A", "meta_2": "Red"}, "value": 0.43388699497426875}, {"id": 6, "metadata": {"meta_1": "C", "meta_2": "Green"}, "value": 0.14265358049247878}, {"id": 7, "metadata": {"meta_1": "C", "meta_2": "Red"}, "value": 0.7823049064345722}, {"id": 8, "metadata": {"meta_1": "B", "meta_2": "Blue"}, "value": 0.9522025604707016}, {"id": 9, "metadata": {"meta_1": "C", "meta_2": "Red"}, "value": 0.3863207799791931}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.