#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()