pandas Python数据框架从dataframe读取json并过滤数据

anhgbhbe  于 2023-08-01  发布在  Python
关注(0)|答案(3)|浏览(79)

我有这样的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所有对象。

案例二:

如果输入值同时为DayofWeek=4和year=2017,那么我想过滤所有来自DayofWeek=4的json的2017年数据。
我试过这个代码,但它不工作

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

zdwk9cvp

zdwk9cvp1#

问题是,你的json-values包含了带有dicts的列表:

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}]}

字符串
...Pandas不能处理这个(据我所知)。
但是如果每个列表只包含一个元素,你可以转换它:

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}}


现在你可以用index的方向做一个DataFrame

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


x1c 0d1x的数据
并访问您的元素:
案例一:

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


案例二:

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


编辑

如果列表中有多个元素,则可以创建一个包含所有条目的列表:

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


因为你有一个Year列,你可能甚至不需要json-/dict-key,所以我跳过了它。:—)

c2e8gylq

c2e8gylq2#

你可以像这样使用列表解析:

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

ohtdti5x

ohtdti5x3#

你拥有的数据并不一致,但显然pandas可以处理这个问题。
pandas.json_normalize可以使用字典中的嵌套列表(另见record_path参数),pandas.concat可以有效地将单独的DataFrame连接在一起:

import pandas
import json

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

df = pandas.concat([pandas.json_normalize(v) for v in data.values()], ignore_index=True)

# Case 1:
df[df['DayofWeek'] == 4]

# Result:
#    DayofWeek                 Date  Year     y       x  Minute
# 0          4  2015-02-06 00:00:00  2015  43.2  10.397     NaN
# 1          4  2016-02-06 00:00:00  2016  43.2  10.397     0.0
# 2          4  2017-02-06 00:00:00  2017  43.2  10.397     0.0

# Case 2:
df[(df['DayofWeek'] == 4) & (df['Year'] == 2017)]

#   DayofWeek                 Date  Year     y       x  Minute
# 2          4  2017-02-06 00:00:00  2017  43.2  10.397     0.0

字符串

相关问题