我有这样的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)
答案 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
并访问您的元素:
案例1:
df[df['DayofWeek']==4]
案例2:
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,因此我只是跳过了它。 :-)