Агрегировать по значению в объекте JSON внутри фрейма данных Pandas в Python

#python #json #pandas #aggregate

#python #json #pandas #агрегировать

Вопрос:

Я загрузил массив json в python как фрейм данных, используя pandas. Мой код на python выглядит следующим образом:

 import json
import pandas as pd

jsontxt = pd.read_json ('array.json')

df = pd.DataFrame(jsontxt['Total-Hours'])

print(df)
  

Результат выглядит следующим образом:

     Total-Hours

0   {'value': 3.0}
1   {'value': 2.0}
2   {'value': 1.0}
3   {'value': 5.0}
4   {'value': 3.0}
5   {'value': 5.0}
  

Я хочу сгруппировать данные по значению в общих часах. Что-то вроде приведенного ниже:

 val = df.groupby(['Total-Hours']).mean();
  

Мой JSON выглядит следующим образом:

 [
              {
                "key" : "Jacob",
                "doc_count" : 11,
                "Total-Hours" : {
                  "value" : 3.0
                },
                "Calculated-Category" : {
                  "value" : 4.0
                }
              },
              {
                "key" : "AH",
                "doc_count" : 2,
                "Total-Hours" : {
                  "value" : 2.0
                },
                "Calculated-Category" : {
                  "value" : 1.0
                }
              },
              {
                "key" : "FJ",
                "doc_count" : 1,
                "Total-Hours" : {
                  "value" : 1.0
                },
                "Calculated-Category" : {
                  "value" : 4.0
                }
              },
              {
                "key" : "Helen",
                "doc_count" : 1,
                "Total-Hours" : {
                  "value" : 5.0
                },
                "Calculated-Category" : {
                  "value" : 2.0
                }
              },
              {
                "key" : "Test",
                "doc_count" : 1,
                "Total-Hours" : {
                  "value" : 3.0
                },
                "Calculated-Category" : {
                  "value" : 3.0
                }
              },
              {
                "key" : "John",
                "doc_count" : 1,
                "Total-Hours" : {
                  "value" : 5.0
                },
                "Calculated-Category" : {
                  "value" : 3.0
                }
              }
            ]
  

Однако для этого требуется, чтобы общее количество часов было числовым. Каков наилучший способ добиться этого?

Комментарии:

1. Не могли бы вы предоставить содержимое файла array.json? Затем я могу попытаться воспроизвести

2. Добавлен JSON к вопросу.

Ответ №1:

Pandas в настоящее время понимает значения строк как типы dict, поэтому вы обновляете массив, используя извлеченный ключ ‘value’ из словаря.

Ниже я использую понимание списка, которое обновляет фрейм данных с извлеченными значениями из словаря. Я печатаю обновленный фрейм данных, а затем, наконец, печатаю среднее значение.

Также обратите внимание, что вам не нужно создавать новый фрейм данных, поскольку он уже есть в jsontxt.

 import pandas as pd

jsontxt = pd.read_json('array.json')

print(jsontxt)

jsontxt['Total Hours'] = [x['value'] for x in jsontxt['Total Hours']]

print(jsontxt)

print(jsontxt.mean())
  

Вот результат

       Total Hours
0  {'value': 3.0}
1  {'value': 2.0}
2  {'value': 1.0}
3  {'value': 5.0}
4  {'value': 3.0}
5  {'value': 5.0}
   Total Hours
0          3.0
1          2.0
2          1.0
3          5.0
4          3.0
5          5.0
Total Hours    3.166667
dtype: float64
  

Вот как выглядел мой входной файл:

 {
    "Total Hours": [
        {"value": 3.0},
        {"value": 2.0},
        {"value": 1.0},
        {"value": 5.0},
        {"value": 3.0},
        {"value": 5.0}
    ]
}
  

Ответ №2:

Вы можете обрабатывать вводимые данные как dict, затем выберите столбец «Общее количество часов». Применить, создаст новую серию из столбца, из которого вы можете вычислить среднее значение

  mean_hours = pd.DataFrame.from_dict(myjson)['Total Hours'].apply(pd.Series).mean()
  

или из полного ввода (дополнительного)

  mean_hours = pd.DataFrame.from_dict(myjson)['Total-Hours'].apply(pd.Series).mean()