【问题标题】:Looping through table rows and collecting data循环遍历表行并收集数据
【发布时间】:2020-12-22 02:24:25
【问题描述】:

我有以下数据:

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”打印到一个列表中或(最好)在一个新表上——见下文。我希望代码循环遍历每一行,直到“节点”列变为不同的数字(即从 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.set_index('[Node', 'Case]).unstack(),这样您就可以非常接近而无需循环
  • 或者你可以df.pivot(index='Node', columns='Case', values=['dx', 'dy', 'dz'])
  • 嗨 - 感谢您的回复。不幸的是,当我执行此方法时,我丢失了左侧“节点”列中的升序数字顺序。我可以采取进一步的步骤来重新排序这些值吗?此外,这些方法是否适用于更多情况,即 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] 这不是我想要的

标签: python python-3.x database pandas loops


【解决方案1】:

试试这个:

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

在 cumcount 上加 1:

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

输出:

               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

【讨论】:

  • 谢谢,这行得通!有没有办法将列标题作为 dx1、dy1 等而不是 dx0、dy0 开始?
  • @MB1903 当然,只需在 cumcount() 之后添加 + 1。查看更新。
  • @MB1903 如果此解决方案对您有帮助,您会考虑accepting
  • 谢谢@ScottBoston - 抱歉,在我接受解决方案之前还有一件事,左侧的节点编号不是按升序排列的。有什么办法吗?
  • 我曾尝试使用 df_out.sort_values(by=['Node'],axis=1, inplace=True) 但没有成功
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2012-08-25
  • 1970-01-01
  • 2017-10-31
  • 2017-06-28
相关资源
最近更新 更多