2

我很尴尬地在这篇文章中提出这个问题,因为我确信它是完全初级的。然而,我花了最后两个小时仔细研究pandas文档,并在阳光下尝试了一切,但无济于事......

例如,考虑一个像这样的数据框:

     A   B   C   D      x      y      z
0   a0  b0  c0  d0  0.007  0.710  0.990
1   a0  b0  c0  d1  0.283  0.040  1.027
2   a0  b0  c1  d0  0.017  0.688  2.840
3   a0  b0  c1  d1  0.167  0.132  2.471
4   a0  b1  c0  d0  0.041  0.851  1.078
5   a0  b1  c0  d1  0.235  1.027  1.027
6   a0  b1  c1  d0  0.037  0.934  2.282
7   a0  b1  c1  d1  0.023  1.049  2.826
8   a1  b0  c0  d0  0.912  0.425  1.055
9   a1  b0  c0  d1  0.329  0.932  0.836
10  a1  b0  c1  d0  0.481  0.681  0.997
11  a1  b0  c1  d1  0.782  0.595  2.294
12  a1  b1  c0  d0  0.264  0.918  0.857
13  a1  b1  c0  d1  0.053  1.001  0.920
14  a1  b1  c1  d0  1.161  1.090  1.470
15  a1  b1  c1  d1  0.130  0.992  2.121

请注意,列ABC和的不同值的每个组合D在此数据框中仅出现一次。因此,可以将此列子集视为“键列”,将其余列视为“值列” 1

我想通过“unstacking”列从这个框架中生成一个新框架C。我的意思是,对于剩余“关键列”( 、 和 )的每个不同的值组合,列ABDC在新框架中产生相应的“值列”。

例如,如果我们暂时忽略列xy我上面提到的拆栈操作将产生数据框:

    A   B   D     c0     c1
0  a0  b0  d0  0.990  2.840
1  a0  b0  d1  1.027  2.471
2  a0  b1  d0  1.078  2.282
3  a0  b1  d1  1.027  2.826
4  a1  b0  d0  1.055  0.997
5  a1  b0  d1  0.836  2.294
6  a1  b1  d0  0.857  1.470
7  a1  b1  d1  0.920  2.121

这里新列的值c0c1是从列的值(在原始数据框中)获得的,对于列、和z的值的相应唯一组合。ABD

我怎样才能做到这一点?

如果能够在新框架中使用某种形式的分层列组织(即现在的列x、并且每个将依次由“子列”和) 组成,或者可能是一些使用复合名称命名新列的方案(例如,在新框架中,列、和将被列、、、、和、等),但这可能希望太多......yzxyzc0c1xyzx_c0x_c1y_c0y_c1z_c0z_c1

PS:这是上面数据帧的数据,采用 TSV 格式:

A   B       C       D       x       y       z
a0  b0      c0      d0      0.007   0.71    0.99
a0  b0      c0      d1      0.283   0.04    1.027
a0  b0      c1      d0      0.017   0.688   2.84
a0  b0      c1      d1      0.167   0.132   2.471
a0  b1      c0      d0      0.041   0.851   1.078
a0  b1      c0      d1      0.235   1.027   1.027
a0  b1      c1      d0      0.037   0.934   2.282
a0  b1      c1      d1      0.023   1.049   2.826
a1  b0      c0      d0      0.912   0.425   1.055
a1  b0      c0      d1      0.329   0.932   0.836
a1  b0      c1      d0      0.481   0.681   0.997
a1  b0      c1      d1      0.782   0.595   2.294
a1  b1      c0      d0      0.264   0.918   0.857
a1  b1      c0      d1      0.053   1.001   0.92
a1  b1      c1      d0      1.161   1.09    1.47
a1  b1      c1      d1      0.13    0.992   2.121

1更明确地说,数据帧与 a同构dict,其键是 4-tuples ('a0', 'b0', 'c0', 'd0'), ('a0', 'b0', 'c0', 'd1'), ..., ('a1', 'b1', 'c1', 'd1'),其值是 3-tuples (0.007, 0.710, 0.990), (0.283, 0.040, 1.027), ..., (0.130, 0.992, 2.121)。我尝试的许多事情之一是找到一种通过“键列”的唯一组合来索引数据帧的方法。同样的故事:这应该是“hello-world”级别的东西pandas,但我无法在文档中找到如何做到这一点。显然,我的大脑和编写pandas文档的人的大脑彼此完全正交......

4

1 回答 1

2

能够对原始框架(即具有所有值列 x、y 和 z 的框架)进行类似的拆垛操作会很好,或者在新框架中使用某种形式的分层列组织(即现在x、y 和 z 列将依次由“子列”c0 和 c1 组成)

怎么样:

>>> df.pivot_table(values=["x","y","z"],rows=["A","B","D"], cols="C")
              x             y             z       
C            c0     c1     c0     c1     c0     c1
A  B  D                                           
a0 b0 d0  0.007  0.017  0.710  0.688  0.990  2.840
      d1  0.283  0.167  0.040  0.132  1.027  2.471
   b1 d0  0.041  0.037  0.851  0.934  1.078  2.282
      d1  0.235  0.023  1.027  1.049  1.027  2.826
a1 b0 d0  0.912  0.481  0.425  0.681  1.055  0.997
      d1  0.329  0.782  0.932  0.595  0.836  2.294
   b1 d0  0.264  1.161  0.918  1.090  0.857  1.470
      d1  0.053  0.130  1.001  0.992  0.920  2.121

请参阅此处,并注意默认聚合函数是mean. 如果你知道你没有多个值进入同一个单元格,就像这里一样,那没关系,但我曾经让自己陷入困境,因为我认为它是sum

于 2013-11-03T14:12:59.383 回答