Как преобразовать Pandas DataFrame в пользовательский JSON? - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в Pandas и пытаюсь преобразовать DataFrame Pandas в пользовательскую вложенную строку JSON (возможно, записать ее в файл).Я пытался использовать встроенную функцию Pandas to_json(), но у меня она не работала.Я публикую часть моего Pandas DF и то, как я хочу, чтобы мой конечный результат выглядел.В идеале я хотел бы, чтобы ключ id был заполнен каким-либо индексом DF.Я думаю, что моя цель здесь состоит в том, чтобы не беспокоиться о том, что имена столбцов, а скорее иметь способ программно превратить DF в строку JSON.Первоначально я написал цикл for, который будет перебирать каждую строку и записывать содержимое в файл, но, подумав, я считаю, что это может привести к ошибкам, поскольку большая часть сериализации JSON обрабатывается вручную.Любая помощь будет оценена.Спасибо и извините за длинный пост.

Pandas Dataframe

              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    

Ожидаемая строка JSON

[
{
  "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"
}
]

1 Ответ

0 голосов
/ 09 октября 2018

Вот способ построить JSON (вроде) динамически.Вам все еще нужно сделать несколько предположений, и я не уверен, что ваш сценарий использования допустит следующее:

  1. Имена столбцов уникальны.
  2. Вы знаете имя столбцаВы хотите использовать в качестве столбца «значение».В моем примере фрейма данных я назвал этот value, sample_frequency будет столбцом «значение» в вашем примерном фрейме данных.
  3. Вы будете использовать индекс фрейма данных в качестве параметра ìd.Это может или не может быть приемлемым.Может случиться так, что вам также нужно будет определить этот столбец заранее, и в этом случае вы должны установить его как индекс кадра данных, используя .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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...