Python 只保留2级多索引数据帧的一列值,而忽略NaN';s

Python 只保留2级多索引数据帧的一列值,而忽略NaN';s,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: | col1 | col2 | col3 | col4 | -------------------------------------------------------------------- type | |cat1|cat2|cat3|cat1|cat2|cat3|cat1|cat2|cat3| -----------------------------

我有一个如下所示的数据帧:

        |     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  |
--------------------------------------------------------------------
        |     col1    |     col2     |     col3     |     col4     |
--------------------------------------------------------------------
0       |ID1          |       1      |       5      |      77      |
--------------------------------------------------------------------
1       |ID2          |       4      |       6      |      8       |
--------------------------------------------------------------------
2       |ID3          |       11     |       9      |      24      |  
--------------------------------------------------------------------
注:

上面有4列,但其中只有3列有更多的子类别

每个子类别的值应该相同,除非存在NaN(可以在任何地方)

我希望使结束数据帧如下所示:

        |     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  |
--------------------------------------------------------------------
        |     col1    |     col2     |     col3     |     col4     |
--------------------------------------------------------------------
0       |ID1          |       1      |       5      |      77      |
--------------------------------------------------------------------
1       |ID2          |       4      |       6      |      8       |
--------------------------------------------------------------------
2       |ID3          |       11     |       9      |      24      |  
--------------------------------------------------------------------
基本上,我想减少额外的级别,只保留类别的值(因为所有值都相同),而不选择NaN

结束数据帧不能有NaN

起初我认为仅仅基于第一个类别进行切片就足够了,但是因为NaN可以在任何地方,所以这不起作用


你知道怎么做吗?

专栏
col1
不是一级专栏。它与其他列具有相同的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')],
           )
要获得所需的输出,您需要在列的
level=0
上执行
groupby
(即
axis=1
)并首先调用

df_out = df.groupby(level=0, axis=1).first()

Out[644]:
     col1  col2  col3  col4
type
0     ID1     1   5.0  77.0
1     ID2     4   6.0   8.0
2     ID3    11   9.0  24.0

熊猫有这样打印输出的方法吗?我只是想知道如何读入它,如果熊猫可以这样输出,我可能可以读入它nicely@oppressionslayer老实说,我不确定这是不是真的。我继承了这些数据,所以我只是尝试将其转换为正确的形式,以便将其放到数据库中。最后一列是
col3
col4
?也就是说,您在一级有重复的列名
col3
?@AndyL.,谢谢您的帮助。它是
col4
。为清晰起见进行了编辑。