Python 循环表行并收集数据

Python 循环表行并收集数据,python,python-3.x,database,pandas,loops,Python,Python 3.x,Database,Pandas,Loops,我有以下数据: Node Case dx dy dz 1 A1 338.5E-9 0.0 163.6E-9 1 A2 0.0 0.0 0.0 1 A3 -133.4E-9 -268.4E-9 -22.36E-6 5 A1 192.6E-9 0.0 -22.47E-9 5 A2 0.0 0.0

我有以下数据:

Node Case         dx         dy         dz
 1   A1   338.5E-9        0.0   163.6E-9
 1   A2        0.0        0.0        0.0
 1   A3  -133.4E-9  -268.4E-9  -22.36E-6
 5   A1   192.6E-9        0.0  -22.47E-9
 5   A2        0.0        0.0        0.0
 5   A3   231.5E-9  -268.4E-9  -35.82E-6
我想迭代地循环遍历每一行数据,并将“dx”、“dy”和“dz”打印到列表中,或者(最好)打印到新表中-请参见下文。我希望代码在每一行中循环,直到列“Node”变为不同的数字(即从1变为5)

因此,我希望新表上的第一行数据如下所示:

        dx1        dy1        dz1       dx2        dy2       dz2         dx3        dy3        dz3   
   338.5E-9        0.0   163.6E-9       0.0        0.0        0.0   -133.4E-9  -268.4E-9  -22.36E-6
任何帮助都将不胜感激。 谢谢

试试这个:

df_out = (df.set_index(['Node', df.groupby('Node').cumcount()])[['dx', 'dy', 'dz']]
            .unstack().sort_index(level=1, axis=1))
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

               dx0  dy0           dz0  dx1  dy1  dz1           dx2           dy2       dz2
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.00003
               dx1  dy1           dz1  dx2  dy2  dz2           dx3           dy3       dz3
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.000036
将+1添加到cumcount:

df_out = (df.set_index(['Node', df.groupby('Node').cumcount() + 1])[['dx', 'dy', 'dz']]
            .unstack().sort_index(level=1, axis=1))
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

               dx0  dy0           dz0  dx1  dy1  dz1           dx2           dy2       dz2
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.00003
               dx1  dy1           dz1  dx2  dy2  dz2           dx3           dy3       dz3
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.000036
试试这个:

df_out = (df.set_index(['Node', df.groupby('Node').cumcount()])[['dx', 'dy', 'dz']]
            .unstack().sort_index(level=1, axis=1))
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

               dx0  dy0           dz0  dx1  dy1  dz1           dx2           dy2       dz2
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.00003
               dx1  dy1           dz1  dx2  dy2  dz2           dx3           dy3       dz3
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.000036
将+1添加到cumcount:

df_out = (df.set_index(['Node', df.groupby('Node').cumcount() + 1])[['dx', 'dy', 'dz']]
            .unstack().sort_index(level=1, axis=1))
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

               dx0  dy0           dz0  dx1  dy1  dz1           dx2           dy2       dz2
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.00003
               dx1  dy1           dz1  dx2  dy2  dz2           dx3           dy3       dz3
Node                                                                                      
1     3.385000e-07  0.0  1.636000e-07  0.0  0.0  0.0 -1.334000e-07 -2.684000e-07 -0.000022
5     1.926000e-07  0.0 -2.247000e-08  0.0  0.0  0.0  2.315000e-07 -2.684000e-07 -0.000036

欢迎,索引重要吗?如果您可以删除索引,那么您可以
df.set_index('[Node',Case]).unstack()
,这可以让您在不循环的情况下非常接近,或者您可以
df.pivot(index='Node',columns='Case',values=['dx',dy',dz'])
Hi谢谢您的回复。不幸的是,当我使用这种方法时,我丢失了左侧“Node”列的升序。我是否可以采取进一步的步骤来重新排序这些值?此外,这些方法是否适用于更多情况,如A1、A2、A3和A4等?是的,对不起,索引很重要-两种方法都给出了以下第一行:[338.5E-9,0.0,-133.4E-9,0.0,0.0,-268.4E-9,163.6E-9,0.0,-22.36E-6]这不是我想要的欢迎,索引重要吗?如果您可以删除索引,那么您可以
df.set_index('[Node',Case]).unstack()
,这可以让您在不循环的情况下非常接近,或者您可以
df.pivot(index='Node',columns='Case',values=['dx',dy',dz'])
Hi谢谢您的回复。不幸的是,当我使用这种方法时,我丢失了左侧“Node”列的升序。我是否可以采取进一步的步骤来重新排序这些值?此外,这些方法是否适用于更多的情况,如A1、A2、A3和A4等?是的,对不起,索引很重要-两种方法都给出了以下第一行:[338.5E-9,0.0,-133.4E-9,0.0,0.0,-268.4E-9,163.6E-9,0.0,-22.36E-6],这不是我要找的汉克斯,这很有效!是否有办法将列标题改为dx1、dy1等而不是dx0、dy0?@MB1903当然,只需在cumcount()之后添加一个+1即可。请参阅Update。@ Mb803。如果这个解决方案帮助你,你会考虑感谢@ ScottBoston -对不起,只有一件事在我接受解决方案之前,左边的节点编号不是按升序排列。有没有办法解决这个问题?我试过使用df_out.sort_值(by=['Node'],axis=1,inplace=True),但它不起作用hanks,这很有效!是否有办法将列标题改为dx1、dy1等而不是dx0、dy0?@MB1903当然,只需在cumcount()之后添加一个+1即可。请参阅Update。@ Mb803。如果这个解决方案帮助你,你会考虑感谢@ ScottBoston -对不起,只有一件事在我接受解决方案之前,左边的节点编号不是按升序排列。有什么办法可以解决这个问题吗?我尝试过使用df_out.sort_值(by=['Node'],axis=1,inplace=True),但没有成功