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
。为清晰起见进行了编辑。