Python 如何在pandas中读取和规范以下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日”,“国家”;“加

我在使用pandas的stackoverflow中看到了许多json读取问题,但我仍然无法解决这个简单的问题

资料
{“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后,您可以合并两个部分:

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