忽略NaN时仅保留2级多索引熊猫数据框的一列值

时间:2019-11-21 18:45:34

标签: python pandas dataframe

我有一个看起来像这样的数据框:

        |     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可以在任何地方,所以不起作用。

有什么想法吗?

1 个答案:

答案 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