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),但没有成功