首页 > 解决方案 > 如何更改熊猫列表的方向

问题描述

我有以下三个列表。

mylist = [["sensor9", [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]], 
      ["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]

columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]

我想改变方向mylist如下使用作为columns标题和. 更具体地说,我的最终输出应如下所示。yearsmylist

id, sensor, time, score_1, score_2
0, sensor9, 2001, 0.5, 0.5
0, sensor9, 2002, 0.3, 0.6
0, sensor9, 2003, 0.8, 0.8
0, sensor9, 2004, 0.9, 0.9
0, sensor9, 2005, 0.8, 0.9
1, sensor12, 2001, 0.6, 0.6
1, sensor12, 2002, 0.5, 0.9
1, sensor12, 2003, 0.9, 0.8
1, sensor12, 2004, 1.0, 0.8
1, sensor12, 2005, 0.9, 0.8

描述上述数据框 id 的数据框

id, sensor
0, sensor9
1, sensor12

我试图DataFrame.from_dict在熊猫中做到这一点。但是,我不确定如何更改 的方向mylist并将其与years熊猫中的对齐。是否有可能做到这一点?

如果需要,我很乐意提供更多详细信息。

标签: pandas

解决方案


使用列表推导生成DataFrame具有转置的列表(嵌套列表)的第二个值 by DataFrame.T,然后concat一起并最后id通过Series.mapDataFrame.insert为第一个位置创建新列:

df1 = pd.DataFrame({'id':[0,1],
                    'sensor':['sensor9','sensor12']})

mylist = [["sensor9",  [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]], 
          ["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]

columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]

L = [pd.DataFrame(x[1], index=columns, columns=years).T for x in mylist]

df = pd.concat(L, keys=[x[0] for x in mylist]).rename_axis(('sensor','time')).reset_index()
df.insert(0, 'id', df['sensor'].map(df1.set_index('sensor')['id']))
print (df)

   id    sensor  time  score_1  score_2
0   0   sensor9  2001      0.5      0.5
1   0   sensor9  2002      0.3      0.6
2   0   sensor9  2003      0.8      0.8
3   0   sensor9  2004      0.9      0.9
4   0   sensor9  2005      0.8      0.9
5   1  sensor12  2001     10.6     10.6
6   1  sensor12  2002      0.5      0.9
7   1  sensor12  2003      0.9      0.8
8   1  sensor12  2004      1.0      0.8
9   1  sensor12  2005      0.9      0.8

编辑:

mylist = [["sensor9",  [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]], 
          ["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]

columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]

L = [pd.DataFrame(x[1], index=columns, columns=years).T for x in mylist]

df = pd.concat(L, keys=[x[0] for x in mylist]).rename_axis(('sensor','time')).reset_index()
df.insert(0, 'id', pd.factorize(df['sensor'])[0])
print (df)
   id    sensor  time  score_1  score_2
0   0   sensor9  2001      0.5      0.5
1   0   sensor9  2002      0.3      0.6
2   0   sensor9  2003      0.8      0.8
3   0   sensor9  2004      0.9      0.9
4   0   sensor9  2005      0.8      0.9
5   1  sensor12  2001     10.6     10.6
6   1  sensor12  2002      0.5      0.9
7   1  sensor12  2003      0.9      0.8
8   1  sensor12  2004      1.0      0.8
9   1  sensor12  2005      0.9      0.8

推荐阅读