Python 如何在pandas中读取和规范以下json?
我在使用pandas的stackoverflow中看到了许多json读取问题,但我仍然无法解决这个简单的问题 资料Python 如何在pandas中读取和规范以下json?,python,json,pandas,Python,Json,Pandas,我在使用pandas的stackoverflow中看到了许多json读取问题,但我仍然无法解决这个简单的问题 资料 {“session_id”:{“0”:[“X061RFWB06K9V”],“1”:[“5AZ2X2A9BHH5U”],“unix_时间戳”:{“0”:[1442503708],“1”:[1441353991],“城市”:{“0”:[“纽约州纽约州纽约市,新泽西州,宾夕法尼亚州费城”],“用户”:{“0”:{“用户id”:2024”,加入U:“2015-03-22日”,“国家”;“加
{“session_id”:{“0”:[“X061RFWB06K9V”],“1”:[“5AZ2X2A9BHH5U”],“unix_时间戳”:{“0”:[1442503708],“1”:[1441353991],“城市”:{“0”:[“纽约州纽约州纽约市,新泽西州,宾夕法尼亚州费城”],“用户”:{“0”:{“用户id”:2024”,加入U:“2015-03-22日”,“国家”;“加入日期”[“国家”;“用户id:“2015年3月28日”{“国家”:“DE”}]}}
我的尝试
将numpy导入为np
作为pd进口熊猫
导入json
从pandas.io.json导入json_规范化
#尝试1
df=pd.read_json('a.json'))
#尝试2
以open('a.json')作为fi:
data=json.load(fi)
df=json\u规范化(数据、记录路径='user',元=['session\u id','unix\u timestamp','cities'])
它们都没有给我所需的输出。
所需输出
首选方法
相关链接
df=pd.read\u json('a.json'))
df1=df.drop('user',轴=1)
df2=json_规范化(df['user'])
df=df1.merge(df2,左索引=True,右索引=True)
这里有一种方法:
import pandas as pd
# lets say d is your json
df = pd.DataFrame.from_dict(d, orient='index').T.reset_index(drop=True)
# unlist each element
df = df.applymap(lambda x: x[0])
# convert user column to multiple cols
df = pd.concat([df.drop('user', axis=1), df['user'].apply(lambda x: x[0]).apply(pd.Series)], axis=1)
session_id unix_timestamp \
0 X061RFWB06K9V 1442503708
1 5AZ2X2A9BHH5U 1441353991
cities user_id joining_date country
0 New York NY, Newark NJ 2024 2015-03-22 UK
1 New York NY, Jersey City NJ, Philadelphia PA 2853 2015-03-28 DE
还有一种方法:
df = pd.read_json(r'C:\path\file.json')
我正在使用
explode
和join
s=pd.DataFrame(j).apply(lambda x : x.str[0])
s['cities']=s.cities.str.split(',')
s=s.explode('cities')
s.reset_index(drop=True,inplace=True)
s=s.join(pd.DataFrame(sum(s.user.tolist(),[])))
session_id unix_timestamp ... joining_date country
0 X061RFWB06K9V 1442503708 ... 2015-03-22 UK
1 X061RFWB06K9V 1442503708 ... 2015-03-22 UK
2 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
3 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
4 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
[5 rows x 7 columns]
我只是想和大家分享另一种将嵌套json中的数据提取到pandas中的方法,供将来的访问者使用。每个列在读入熊猫之前都被提取出来。在这里很方便,因为它允许轻松遍历json数据:
import jmespath
from pprint import pprint
expression = jmespath.compile('''{session_id:session_id.*[],
unix_timestamp : unix_timestamp.*[],
cities:cities.*[],
user_id : user.*[][].user_id,
joining_date : user.*[][].joining_date,
country : user.*[][].country
}''')
res = expression.search(data)
pprint(res)
{'cities': ['New York NY, Newark NJ',
'New York NY, Jersey City NJ, Philadelphia PA'],
'country': ['UK', 'DE'],
'joining_date': ['2015-03-22', '2015-03-28'],
'session_id': ['X061RFWB06K9V', '5AZ2X2A9BHH5U'],
'unix_timestamp': [1442503708, 1441353991],
'user_id': [2024, 2853]}
将数据读入熊猫,将城市读入各行:
df = (pd.DataFrame(res)
.assign(cities = lambda x: x.cities.str.split(','))
.explode('cities')
)
df
session_id unix_timestamp cities user_id joining_date country
0 X061RFWB06K9V 1442503708 New York NY 2024 2015-03-22 UK
0 X061RFWB06K9V 1442503708 Newark NJ 2024 2015-03-22 UK
1 5AZ2X2A9BHH5U 1441353991 New York NY 2853 2015-03-28 DE
1 5AZ2X2A9BHH5U 1441353991 Jersey City NJ 2853 2015-03-28 DE
1 5AZ2X2A9BHH5U 1441353991 Philadelphia PA 2853 2015-03-28 DE
你为什么选择这里的
cities
和user
?@Jonnyboi我记不太清楚,因为那是一年多以前的事了,但从外观上看,read_json返回了一个列表,其中包含了我们想要作为行的相同会话id和unix时间戳,因此我们将其分解。然后,我们将用户(这也是一个列表,但我们希望将其作为列)转换为数据帧并重新分配。
session_id unix_timestamp cities user_id joining_date \
0 X061RFWB06K9V 1442503708 New York NY 2024 2015-03-22
0 X061RFWB06K9V 1442503708 Newark NJ 2024 2015-03-22
1 5AZ2X2A9BHH5U 1441353991 New York NY 2024 2015-03-22
1 5AZ2X2A9BHH5U 1441353991 Jersey City NJ 2024 2015-03-22
1 5AZ2X2A9BHH5U 1441353991 Philadelphia PA 2024 2015-03-22
country
0 UK
0 UK
1 UK
1 UK
1 UK
s=pd.DataFrame(j).apply(lambda x : x.str[0])
s['cities']=s.cities.str.split(',')
s=s.explode('cities')
s.reset_index(drop=True,inplace=True)
s=s.join(pd.DataFrame(sum(s.user.tolist(),[])))
session_id unix_timestamp ... joining_date country
0 X061RFWB06K9V 1442503708 ... 2015-03-22 UK
1 X061RFWB06K9V 1442503708 ... 2015-03-22 UK
2 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
3 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
4 5AZ2X2A9BHH5U 1441353991 ... 2015-03-28 DE
[5 rows x 7 columns]
import jmespath
from pprint import pprint
expression = jmespath.compile('''{session_id:session_id.*[],
unix_timestamp : unix_timestamp.*[],
cities:cities.*[],
user_id : user.*[][].user_id,
joining_date : user.*[][].joining_date,
country : user.*[][].country
}''')
res = expression.search(data)
pprint(res)
{'cities': ['New York NY, Newark NJ',
'New York NY, Jersey City NJ, Philadelphia PA'],
'country': ['UK', 'DE'],
'joining_date': ['2015-03-22', '2015-03-28'],
'session_id': ['X061RFWB06K9V', '5AZ2X2A9BHH5U'],
'unix_timestamp': [1442503708, 1441353991],
'user_id': [2024, 2853]}
df = (pd.DataFrame(res)
.assign(cities = lambda x: x.cities.str.split(','))
.explode('cities')
)
df
session_id unix_timestamp cities user_id joining_date country
0 X061RFWB06K9V 1442503708 New York NY 2024 2015-03-22 UK
0 X061RFWB06K9V 1442503708 Newark NJ 2024 2015-03-22 UK
1 5AZ2X2A9BHH5U 1441353991 New York NY 2853 2015-03-28 DE
1 5AZ2X2A9BHH5U 1441353991 Jersey City NJ 2853 2015-03-28 DE
1 5AZ2X2A9BHH5U 1441353991 Philadelphia PA 2853 2015-03-28 DE