Python数据框读取json并从数据框过滤数据

时间:2019-07-09 11:02:11

标签: python django pandas python-2.7 dataframe

我有这样的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等)过滤数据。

示例:

案例1:

如果输入值是DayofWeek = 4,那么我想过滤所有具有DayofWeek = 4的对象。

案例2:

如果输入值既是DayofWeek = 4又是year = 2017,那么我想从具有DayofWeek = 4的json过滤所有2017年数据。

我已经尝试过此代码,但无法正常工作

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

2 个答案:

答案 0 :(得分:1)

您可以像这样使用列表理解:

[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])

答案 1 :(得分:1)

问题是,您的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-key,因此我只是跳过了它。 :-)