python - 找不到解压数据框的方法

标签 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

我想通过“unstacking”列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列的值(在原始数据框中)获得的,对于列AB的值的相应唯一组合、D

我该怎么做?

如果能够使用某种形式的分层列对原始框架(即具有所有值列xyz的框架)进行类似的拆栈操作,那就太好了新框架中的组织(即现在列xyz每个依次包含“子列”c0c1),或者也许使用复合名称命名新列的一些方案(例如,在新框架中,列xyz将被替换为列x_c0x_c1y_c0y_c1 ”、z_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更明确地说,数据帧与dict同构,其键是 4 元组('a0', 'b0', 'c0', 'd0'), ('a0', 'b0', 'c0', 'd1'), ..., ('a1', 'b1', 'c1', 'd1'),其值是 3 -元组(0.007, 0.710, 0.990), (0.283, 0.040, 1.027), ..., (0.130, 0.992, 2.121)。我尝试过的许多事情之一是找到一种通过“关键列”的独特组合来索引数据框的方法。同样的故事:这应该是pandas中的“hello-world”级别的内容,但我无法在文档中找到如何做到这一点。显然,我的大脑和编写pandas文档的人的大脑是完全正交的......

最佳答案

It'd be nice to be able to do a similar unstacking operation with the original frame (i.e. the one with all value columns x, y, and z), either using some form of hierarchical column organization in the new frame (i.e. where now columns x, y, and z would each consist, in turn, of "subcolums" c0 and 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

关于python - 找不到解压数据框的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753731/

相关文章:

python - 使用 BeautifulSoup 抓取没有唯一标识符的元素

python - 根据实例变量有条件地禁用缓存装饰器

python - 在导入的文件中进行本地导入

python - 从具有 'different date format"的数据框中的日期列中提取年份 - python

python - 基于多索引比较选择行

python - 查找每列的唯一值

python - 管道长时间运行的进程

python - 按值或按引用传递

python - 在Python中将多张Excel文件按一列拆分

python - 在 Pandas 数据框中获得最小的一行