我有一张大桌子,上面的行代表观察值。我的列的子集可以按两个元类别进行分组,因此我已使用multiindex表示了它们。但是,multiindex不适用于所有列。因此,其余所有列仅在第一级具有索引标签。
我想将melt()应用到其中的某些多维列,然后再通过索引列将它们合并()并与我的主表一起返回。
这里是我卡住的零件的MRE。我有一个这样的数据框:
df = pd.DataFrame({
('INDEX',): [1,2,3],
('a','x'): ['ww','rt','pb'],
('a','y'): [88,97,12],
('b','x'): ['ew','tr','cv'],
('b','y'): [14,42,67],
('c','x'): ['wq','fg','dg'],
('c','y'): [65,78,46]})
df
INDEX a b c
NaN x y x y x y
0 1 ww 88 ew 14 wq 65
1 2 rt 97 tr 42 fg 78
2 3 pb 12 cv 67 dg 46
现在我想要这个:
df.melt(id_vars=('INDEX',))
...导致此:
INDEX thing_1 thing_2 value
1 a x ww
2 a x rt
3 a x pb
1 a y 88
2 a y 97
3 a y 12
1 b x ew
2 b x tr
3 b x cv
1 b y 14
2 b y 42
3 b y 67
1 c x wq
2 c x fg
3 c x dg
1 c y 65
2 c y 78
3 c y 46
但是我得到了以Exception: Data must be 1-dimensional
结尾的长回溯。
[当我第一次尝试进行此操作时,我试图提供value_vars
,但没有运气;后来我意识到del df['INDEX']; df.melt()
毫无问题,除了我想保留INDEX列。
[我还尝试了一些变体,例如将'INDEX'放入1元组,以np.nan
和slice(None)
结尾的2元组,列表等。对于一维数据,我也有同样的抱怨,或在某些情况下为ValueError: id_vars must be a list of tuples when columns are a MultiIndex
。
解决此问题的正确方法是什么?经过一堆反复试验后,我找到了一个解决方案,我将在下面发布,但看来它应该更简单或更优雅。谢谢。
[我开始提出这个问题后,偶然发现了一个解决方案。
如果在我的DataFrame分配中将('INDEX',)
替换为('INDEX','foo')
,那么我会得到这样的解决方案:
df.melt(id_vars=[('INDEX','foo')])
(INDEX, foo) variable_0 variable_1 value
0 1 a x ww
1 2 a x rt
2 3 a x pb
3 1 a y 88
4 2 a y 97
[...]
您可以使用空字符串作为INDEX
的第二级
df = pd.DataFrame({
('INDEX',''): [1,2,3],
('a','x'): ['ww','rt','pb'],
('a','y'): [88,97,12],
('b','x'): ['ew','tr','cv'],
('b','y'): [14,42,67],
('c','x'): ['wq','fg','dg'],
('c','y'): [65,78,46]})
In [198]: df
Out[198]:
INDEX a b c
x y x y x y
0 1 ww 88 ew 14 wq 65
1 2 rt 97 tr 42 fg 78
2 3 pb 12 cv 67 dg 46
df.melt(id_vars='INDEX')
Out[200]:
INDEX variable_0 variable_1 value
0 1 a x ww
1 2 a x rt
2 3 a x pb
3 1 a y 88
4 2 a y 97
5 3 a y 12
6 1 b x ew
7 2 b x tr
8 3 b x cv
9 1 b y 14
10 2 b y 42
11 3 b y 67
12 1 c x wq
13 2 c x fg
14 3 c x dg
15 1 c y 65
16 2 c y 78
17 3 c y 46