пользовательская вложенная структура json с различными наборами - PullRequest
0 голосов
/ 29 апреля 2019

Я новичок в Python, и у панд есть CSV-файл с

.----.---------.-------.-------------------.-------------------.-------------------.-------------------.
| id | country | state | cold_stress_score | cold_stress_level | heat_stress_score | heat_stress_level |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  1 | USA     | NJ    |             0.003 | low               |             0.673 | moderate          |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  2 | USA     | NJ    |             0.001 | high              |               0.2 | high              |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  3 | USA     | NJ    |             0.004 | moderate          |               0.3 | low               |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  4 | USA     | NY    |             0.005 | moderate          |               0.4 | moderate          |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  5 | USA     | NY    |             0.006 | high              |               0.5 | high              |
:----+---------+-------+-------------------+-------------------+-------------------+-------------------:
|  6 | USA     | NY    |             0.009 | low               |               0.6 | low               |
'----'---------'-------'-------------------'-------------------'-------------------'-------------------'

и я хотел преобразовать это во вложенный способ json

Ожидаемый JSON

  {
  "id":1,
  "country": "USA",
  "state": "NJ",
  "cold_stress":{
    "cold_stress_score" : 0.003,
    "cold_stress_level": "low",
  },
  "heat_stress":{
    "heat_stress_score" : 0.0673,
    "heat_stress_level": "moderate",

  }

}

Я пробовал это решение Преобразование кадра данных Pandas во вложенный JSON

j = (df.groupby(['id','country','state'], as_index=False)
             .apply(lambda x: x[['cold_stress_score','cold_stress_level']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'cold_stress'})
             .to_json(orient='records'))

Я хотел добавить тепловой стресс в JSON приведенный выше код возвращает

  "id":1,
  "country": "USA",
  "state": "NJ",
  "cold_stress":{
    "cold_stress_score" : 0.003,
    "cold_stress_level": "low",
  }
}

как я могу добавить heat_stress, мой csv слишком большой, и я ищу динамическое значение, заполняющее выше, как холодный стресс

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Если вы выполняете мало или вообще не обрабатываете, как здесь, панды и излишни, и слишком сложны.Я советую придерживаться модулей csv и json из стандартной библиотеки.

Код может быть (более или менее):

with open(inputfile) as fdin, open (outputfile, "w") as fdout:
    rd = csv.DictReader(fdin)
    js = [{'id': int(row['id']), 'country': row['country'], 'state': row['state'],
           'cold_stress': {'cold_stress_code': row['cold_stress_code'],
                           'cold_stress_level': row['cold_stress_level']},  
           'heat_stress': {'heat_stress_code': row['heat_stress_code'],
                           'heat_stress_level': row['heat_stress_level']}, 
           } for row in rd]
    json.dump(js, fdout, indent=2)
0 голосов
/ 29 апреля 2019

Вы пробовали что-то вроде

# create first grouping (leave heat columns same)
j = (df.groupby(['id','country','state', 'heat_stress_score', 'heat_stress_level'], as_index=False)
             .apply(lambda x: x[['cold_stress_score','cold_stress_level']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'cold_stress'}))
# care about heat grouping
j = (j.groupby(['id','country','state', 'cold_stress'], as_index=False)
             .apply(lambda x: x[['heat_stress_score','heat_stress_level']].to_dict('r'))
             .reset_index()
             .rename(columns={0:'heat_stress'})
             .to_json(orient='records'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...