我很尴尬地在这篇文章中提出问题,因为我确信它是完全基本的。然而,我花了最后两个小时研究了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 。
我想通过“取消堆叠”列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
的值(在原始数据框中)中获取的,用于列的相应唯一值组合{ {1}},A
和B
。
我该怎么做?
能够对原始帧(即具有所有值列D
,x
和y
)进行类似的取消堆叠操作会很高兴在新框架中使用某种形式的分层列组织(即现在列z
,x
和y
每个依次包含“子标题“z
和c0
”,或者可能是使用复合名称命名新列的一些方案(例如,在新的框架列c1
,x
和{{1 }列将被列y
,z
,x_c0
,x_c1
,y_c0
和y_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)
文档的人的大脑彼此完全正交......
答案 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
。