【发布时间】:2020-02-10 14:42:57
【问题描述】:
我有一张大表,其中的行代表观察结果。我的列的一个子集可以按两个元类别分组,所以我使用多索引来表示这些。但是,多索引并不适用于所有列。所以剩下的所有列都只在第一级有索引标签。
我想将 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。
解决这个问题的正确方法是什么?经过大量试验和错误后,我找到了一个解决方案,我将在下面发布,但它似乎应该更简单或更优雅。谢谢。
【问题讨论】:
标签: python pandas multi-index melt