我如何通过不同的 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_records
和 np.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
我正在处理一些 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_records
和 np.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