首页 > 解决方案 > 如何通过不同的 id 迭代 pandas 列并连接输出?

问题描述

我正在处理一些 OBD2 远程信息处理数据,我设法将 JSON 类型的数据转换为 pandas 数据框,但是,我还需要处理包含多个键的嵌套字典。下面是示例数据

d =  [{'id':'001','0':{'speed':10 , 'voltage':12.3 ,'overspeedCount':2},'1':{'speed':50 , 'voltage':12.2 ,'overspeedCount' :1},'2':{'speed':50 , 'voltage':12.2 ,'overspeedCount' :1}}, {'id':'002','0':{'speed':13 , 'voltage':12.1 ,'overspeedCount' :1},'1':{'speed':40 ,'voltage':12.1 ,'overspeedCount' :0}, '2':{'speed':25 , 'voltage':12.2 ,'overspeedCount' :3}}]

我需要将以上内容转换为不包含 dict 的 pandas 数据框

我设法使用以下代码将 d 转换为 pandas 数据框;

pd.DataFrame(d)

并通过使用以下方法维护 id 来连接前两列数据;

pd.concat([pd.merge(test[['id']],test['0'].apply(pd.Series),how='outer',left_index=True,right_index=True),
         pd.merge(test[['id']],test['1'].apply(pd.Series),how='outer',left_index=True,right_index=True)]).reset_index()

但是在实际数据中,我有超过 2 列.. 了解我们需要使用“for”循环,我被困在这里

d =  [{'id':'001','0':{'speed':10 , 'voltage':12.3 ,'overspeedCount':2},'1':{'speed':50 , 'voltage':12.2 ,'overspeedCount' :1},'2':{'speed':50 , 'voltage':12.2 ,'overspeedCount' :1}}, {'id':'002','0':{'speed':13 , 'voltage':12.1 ,'overspeedCount' :1},'1':{'speed':40 ,'voltage':12.1 ,'overspeedCount' :0}, '2':{'speed':25 , 'voltage':12.2 ,'overspeedCount' :3}}]

 pd.DataFrame(d)


 pd.concat([pd.merge(test[['id']],test['0'].apply(pd.Series),how='outer',left_index=True,right_index=True),
         pd.merge(test[['id']],test['1'].apply(pd.Series),how='outer',left_index=True,right_index=True)]).reset_index()

还尝试了以下操作(通过考虑将列 str 转换为 int)但最终出现错误消息

n=0


for col in test.columns[n]:

pd.concat([pd.merge(test[['id']],test[n].apply(pd.Series),how='outer',left_index=True,right_index=True),
         pd.merge(test[['id']],test[n+1].apply(pd.Series),how='outer',left_index=True,right_index=True)]).reset_index()

n+1

数据集图片

标签: pandasdictionaryappendconcat

解决方案


df = pd.DataFrame(d)
df = df.set_index('id')
res = df.stack()
res.index = res.index.droplevel(1)
res = res.apply(lambda x: list(x.values()))
pd.DataFrame(res.values.tolist(), index=res.index, columns=['speed','voltage','overspeedCount'])

输出

     speed  voltage  overspeedCount
id                                 
001     10     12.3               2
001     50     12.2               1
001     50     12.2               1
002     13     12.1               1
002     40     12.1               0
002     25     12.2               3

推荐阅读