我对在这篇文章中提出这个问题感到非常尴尬,因为我确信它完全是初级的。然而,我在过去的两个小时里仔细研究了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
请注意,A
、B
、C
和D
列的不同值的每个组合在此数据框中仅出现一次。因此,我们可以将这一列子集视为“关键列”,将其余列视为“值列”1。
我想通过“unstacking”列C
从这个框架生成一个新框架。我的意思是,对于其余“关键列”(A
、B
和D
)的值的每个不同组合,C
列的值会产生相应的“值列”在新框架中。
例如,如果我们暂时忽略列x
和y
,我上面提到的拆栈操作将生成数据帧:
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
这里,新列c0
和c1
的值是从z
列的值(在原始数据框中)获得的,对于列A
、B
的值的相应唯一组合、D
。
我该怎么做?
如果能够使用某种形式的分层列对原始框架(即具有所有值列x
、y
和z
的框架)进行类似的拆栈操作,那就太好了新框架中的组织(即现在列x
、y
和z
将每个依次包含“子列”c0
和c1
),或者也许使用复合名称命名新列的一些方案(例如,在新框架中,列x
、y
和z
将被替换为列x_c0
、x_c1
、y_c0
、y_c1
”、z_c0
和z_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/