我如何通过不同的 id 迭代 pandas 列并连接输出?

How do i iterate pandas columns by different id and concat the output?

我正在处理一些 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}}]

我需要将上面的内容转换为 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

Dataset image

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

您不需要 apply。您可以直接使用 from_recordsnp.repeat 构建新的 df 作为索引。

df = pd.DataFrame(d)
s = df.pop('id')
df1 = pd.DataFrame.from_records(df.stack().values, index=np.repeat(s, df.shape[1]))

Out[1051]:
     overspeedCount  speed  voltage
id
001  2               10     12.3
001  1               50     12.2
001  1               50     12.2
002  1               13     12.1
002  0               40     12.1
002  3               25     12.2