我有以下四个列表,其中每个node
都有6个时间序列值,这些值基于2001-2006年的年份排序(即2001
,2002
,2003
,2004
,2005
,2006
)。
mylist1 = [['node1', 3.2, 4.5, 6.8, 7.6, 8.8, 9.6], ['node2', 6.2, 9.5, 2.8, 8.6, 1.8, 8.6]]
mylist2 = [['node1', 3, 4, 6, 7, 8, 9], ['node2', 6, 9, 2, 8, 1, 8]]
mylist3 = [['node1', 3.6, 4.2, 6.6, 7.8, 8.9, 9.5], ['node2', 6.8, 9.9, 2.5, 8.2, 1.6, 8.2]]
mylist4 = [['node1', 2, 5, 8, 6, 8, 6], ['node2', 2, 5, 8, 6, 8, 6]]
我想将上述4个列表转换为以下熊猫数据框。
id year mylist1 mylist2 mylist3 mylist4
node1 2001 3.2 3 3.6 2
node1 2002 4.5 4 4.2 5
node1 2003 6.8 6 6.6 8
node1 2004 7.6 7 7.8 6
node1 2005 8.8 8 8.9 8
node1 2006 9.6 9 9.5 6
node2 2001 6.2 6 6.8 2
node2 2002 9.5 9 9.9 5
node2 2003 2.8 2 2.5 8
node2 2004 8.6 8 8.2 6
node2 2005 1.8 1 1.6 8
node2 2006 8.6 8 8.2 6
我将列表如下转换为熊猫数据框。
df1 = pd.DataFrame(list(mylist1))
df2 = pd.DataFrame(list(mylist2))
df3 = pd.DataFrame(list(mylist3))
df4 = pd.DataFrame(list(mylist4))
但是,我不确定如何连接这些数据帧以获得如上所述的时间序列垂直对齐。
很高兴在需要时提供更多详细信息。
答案 0 :(得分:2)
尝试:
this.gridApi.getModel().doFilter = function (changedPath) {
changedPath.forEachChangedNodeDepthFirst((rowNode) => {
rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;
rowNode.setAllChildrenCount(null);
}, true);
};
this.gridApi.getModel().doSort = function () {
this.rootNode.childrenAfterSort = this.rootNode.childrenAfterFilter.slice(0);
};
结果如下:
from functools import reduce
lists = [mylist1, mylist2, mylist3, mylist4]
dfs = [pd.DataFrame(mylist).melt(id_vars = [0]).loc[:,[0, 'value']].rename(columns = \
{"value":'mylist{}'.format(i+1), 0:'id'}) \
for i, mylist in enumerate(lists)]
df_final = reduce(lambda left,right: pd.merge(left,right.pop(right.columns[1]).to_frame(),\
left_index= True, right_index = True), dfs)
df_final = df_final.sort_values('id').reset_index(drop = True)
您可以随后通过以下操作添加年份:
id mylist1 mylist2 mylist3 mylist4
0 node1 3.2 3 3.6 2
2 node1 4.5 4 4.2 5
4 node1 6.8 6 6.6 8
6 node1 7.6 7 7.8 6
8 node1 8.8 8 8.9 8
10 node1 9.6 9 9.5 6
1 node2 6.2 6 6.8 2
3 node2 9.5 9 9.9 5
5 node2 2.8 2 2.5 8
7 node2 8.6 8 8.2 6
9 node2 1.8 1 1.6 8
11 node2 8.6 8 8.2 6
答案 1 :(得分:2)
我将MultiIndex
用于索引。从每个mylist
和node
的名称创建多索引。使用所有mylist的concat创建一个数据框,并将索引分配为multiindex。最后,取消堆栈,删除不需要的列,转置,sort_index并删除不需要的索引级别:
l1 = ['mylist1','mylist2','mylist3','mylist4']
l2 = ['node1', 'node2']
idx = pd.MultiIndex.from_product([l1, l2])
(pd.DataFrame(mylist1+mylist2+mylist3+mylist4, index=idx).drop(0,1).unstack().T
.sort_index(level=1).droplevel(0))
Out[283]:
mylist1 mylist2 mylist3 mylist4
node1 3.2 3.0 3.6 2.0
node1 4.5 4.0 4.2 5.0
node1 6.8 6.0 6.6 8.0
node1 7.6 7.0 7.8 6.0
node1 8.8 8.0 8.9 8.0
node1 9.6 9.0 9.5 6.0
node2 6.2 6.0 6.8 2.0
node2 9.5 9.0 9.9 5.0
node2 2.8 2.0 2.5 8.0
node2 8.6 8.0 8.2 6.0
node2 1.8 1.0 1.6 8.0
node2 8.6 8.0 8.2 6.0
答案 2 :(得分:1)
另一种方法
df = pd.DataFrame(mylist1+mylist2+mylist3+mylist4).sort_values(0).reset_index(drop=True)
first_half = a.loc[:3,1:].T
second_half = a.loc[4:,1:].T
first_half['id'] = 'node1'
first_half['year'] = np.arange(2001,2007)
second_half['id'] = 'node2'
second_half['year'] = np.arange(2001,2007)
master = pd.concat([first_half,second_half]).reset_index(drop=True)
master = master[['id','year',0,1,2,3]]
master.columns = ['id','year','mylist1','mylist2','mylist3','mylist4']
##master
输出
id year mylist1 mylist2 mylist3 mylist4
0 node1 2001 3.2 3.0 3.6 2.0
1 node1 2002 4.5 4.0 4.2 5.0
2 node1 2003 6.8 6.0 6.6 8.0
3 node1 2004 7.6 7.0 7.8 6.0
4 node1 2005 8.8 8.0 8.9 8.0
5 node1 2006 9.6 9.0 9.5 6.0
6 node2 2001 6.2 6.0 6.8 2.0
7 node2 2002 9.5 9.0 9.9 5.0
8 node2 2003 2.8 2.0 2.5 8.0
9 node2 2004 8.6 8.0 8.2 6.0
10 node2 2005 1.8 1.0 1.6 8.0
11 node2 2006 8.6 8.0 8.2 6.0