找不到卸载数据帧的方法

时间:2013-11-03 13:55:53

标签: python pandas

我很尴尬地在这篇文章中提出问题,因为我确信它是完全基本的。然而,我花了最后两个小时研究了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

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

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

例如,如果我们暂时忽略列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的值(在原始数据框中)中获取的,用于列的相应唯一值组合{ {1}},AB

我该怎么做?

能够对原始帧(即具有所有值列Dxy)进行类似的取消堆叠操作会很高兴在新框架中使用某种形式的分层列组织(即现在列zxy 每个依次包含“子标题“zc0”,或者可能是使用复合名称命名新列的一些方案(例如,在新的框架列c1x和{{1 }列将被列yzx_c0x_c1y_c0y_c1等列替换,但是这可能是希望得太多......

PS:以下是TSV格式的数据帧数据:

z_c0

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

1 个答案:

答案 0 :(得分:2)

  

能够用它进行类似的拆卸操作真是太好了   原始帧(即具有所有值列x,y和z的帧),   要么在新的中使用某种形式的分层列组织   框架(即现在的列x,y和z各自依次组成)   “subcolums”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

请参阅here,并注意默认聚合函数为mean。如果你知道你没有多个值传递到同一个单元格,就像这里一样,这并不重要,但我曾经遇到麻烦,因为我认为它是sum