Фрейм данных Python считывает json и фильтрует данные из фрейма данных - PullRequest
0 голосов
/ 09 июля 2019

У меня есть такой формат json

  {
  "2015": [
    {
      "DayofWeek": 4,
      "Date": "2015-02-06 00:00:00",
      "Year": 2015,
      "y": 43.2,
      "x": 10.397
    }
  ],
  "2016": [
    {
      "DayofWeek": 4,
      "Date": "2016-02-06 00:00:00",
      "Year": 2016,
      "y": 43.2,
      "x": 10.397,
      "Minute": 0
    }
  ],
  "2017": [
    {
      "DayofWeek": 4,
      "Date": "2017-02-06 00:00:00",
      "Year": 2017,
      "y": 43.2,
      "x": 10.397,
      "Minute": 0
    }
  ]
}

Я читаю JSON-файл вот так и после чтения json-файла;преобразование его во фрейм данных

 with open('sample.json') as json_data:
    data = json.load(json_data)

df=pd.DataFrame([data])

Теперь я хочу отфильтровать данные на основе определенного значения ключа ввода, такого как DayofWeek и Year и т. д.

Пример:

Case1:

если входное значение DayofWeek = 4, то я хочу отфильтровать все объекты, имеющие DayofWeek = 4.

Case2:

если входное значение равно DayofWeek = 4 и year = 2017, то я хочу отфильтровать все данные за 2017 год из json, у которого DayofWeek = 4.

Я пробовал этот код, но он не работает

filteredVal=df['2017']
filter_v={'2015':{'DayofYear':4}}
pd.Series(filter_v)

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Проблема в том, что ваши json-значения содержат списки с комментариями:

data
>>
{'2015': [{'DayofWeek': 4,
   'Date': '2015-02-06 00:00:00',
   'Year': 2015,
   'y': 43.2,
   'x': 10.397}],
 '2016': [{'DayofWeek': 4,
   'Date': '2016-02-06 00:00:00',
   'Year': 2016,
   'y': 43.2,
   'x': 10.397,
   'Minute': 0}],
 '2017': [{'DayofWeek': 4,
   'Date': '2017-02-06 00:00:00',
   'Year': 2017,
   'y': 43.2,
   'x': 10.397,
   'Minute': 0}]}

... панды не могут это обработать (насколько я знаю).

Но если каждый список содержит только 1 элемент, вы можете преобразовать его:

data_dict = {d: data[d][0] for d in data}
data_dict
>>
{'2015': {'DayofWeek': 4,
  'Date': '2015-02-06 00:00:00',
  'Year': 2015,
  'y': 43.2,
  'x': 10.397},
 '2016': {'DayofWeek': 4,
  'Date': '2016-02-06 00:00:00',
  'Year': 2016,
  'y': 43.2,
  'x': 10.397,
  'Minute': 0},
 '2017': {'DayofWeek': 4,
  'Date': '2017-02-06 00:00:00',
  'Year': 2017,
  'y': 43.2,
  'x': 10.397,
  'Minute': 0}}

Теперь вы можете сделать из него DataFrame с ориентацией index:

df=pd.DataFrame.from_dict(data_dict, orient='index')
df

enter image description here

И доступ к вашим элементам:

Вариант 1:

df[df['DayofWeek']==4]

Вариант 2:

df[(df['DayofWeek']==4) & (df['Year']==2017)]

enter image description here

РЕДАКТИРОВАТЬ

Если у вас есть несколько элементов в списке, вы можете просто создать список всех записей:

data_list = [v for d in data for v in data[d]]
df = pd.DataFrame(data_list)

Поскольку у вас есть столбец Year, вам, вероятно, даже не нужен ключ json- / dict, поэтому я просто пропустил его. : -)

1 голос
/ 09 июля 2019

Вы можете использовать понимание списка следующим образом:

[data[x] for x in data if data[x][0]['DayofWeek'] == 4 and data[x][0]['Year'] == 2017]

Это даст вам список словарных статей. Если вы хотите отфильтрованный словарь (для преобразования в DataFrame), вы можете вместо этого сделать что-то вроде этого:

filtered_data = {}
filtered_data.update([(x, data[x]) for x in data if data[x][0]['DayofWeek'] == 4 and data[x][0]['Year'] == 2017])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...