我有一个看起来像这样的数据框:
| col1 | col2 | col3 | col4 |
--------------------------------------------------------------------
type | |cat1|cat2|cat3|cat1|cat2|cat3|cat1|cat2|cat3|
--------------------------------------------------------------------
0 |ID1 |1 |NaN |1 |NaN |5 |5 |77 |77 |77 |
--------------------------------------------------------------------
1 |ID2 |4 |4 |NaN |6 |6 |6 |NaN |8 |8 |
--------------------------------------------------------------------
2 |ID3 |11 |11 |11 |9 |9 |NaN |24 |NaN |24 |
--------------------------------------------------------------------
注意:
上方有4列,但只有3列具有进一步的子类别。
每个子类别的值都应相同,除非存在NaN(可以在任何地方)。
我想使最终数据帧看起来像这样:
| col1 | col2 | col3 | col4 |
--------------------------------------------------------------------
0 |ID1 | 1 | 5 | 77 |
--------------------------------------------------------------------
1 |ID2 | 4 | 6 | 8 |
--------------------------------------------------------------------
2 |ID3 | 11 | 9 | 24 |
--------------------------------------------------------------------
基本上我想减少多余的级别,只保留类别的值(因为所有值都相同),而不选择NaN。
最终数据帧不能包含NaN。
最初,我认为仅基于第一类进行切片就足够了,但是由于NaN可以在任何地方,所以不起作用。
有什么想法吗?
答案 0 :(得分:0)
列col1
不是1级列。它具有与其他列相同的2个级别。它的第二级不显示任何内容,因为它是空字符串。尝试运行df.columns
,您会看到这样的输出
print(df.columns)
Out[637]:
MultiIndex([('col1', ''),
('col2', 'cat1'),
('col2', 'cat2'),
('col2', 'cat3'),
('col3', 'cat1'),
('col3', 'cat2'),
('col3', 'cat3'),
('col4', 'cat1'),
('col4', 'cat2'),
('col4', 'cat3')],
)
要获得所需的输出,您需要在列groupby
的{{1}}上使用level=0
并调用axis=1
first