我正在尝试做一些转换,有点卡住了。希望有人能帮我解决这个问题。
l0 a b c d e f
l1 1 2 1 2 1 2 1 2 1 2 1 2
0 NaN NaN NaN NaN 93.4 NaN NaN NaN NaN NaN 19.0 28.9
1 NaN 9.0 NaN NaN 43.5 32.0 NaN NaN NaN NaN NaN 3.4
2 NaN 5.0 NaN NaN 93.3 83.6 NaN NaN NaN NaN 59.5 28.2
3 NaN 19.6 NaN NaN 72.8 47.4 NaN NaN NaN NaN 31.5 67.2
4 NaN NaN NaN NaN NaN 62.5 NaN NaN NaN NaN NaN 1.8
我有一个数据帧(如上所示),正如你所看到的,有多个'NaN‘和一个多索引列。沿着level =0选择列(即l0
)
如果全部都是NaN,我想删除整个列。因此,在本例中,列的
l0 = ['b', 'd', 'e'] # drop-cols
应从数据帧中删除
l0 a c f
l1 1 2 1 2 1 2
0 NaN NaN 93.4 NaN 19.0 28.9
1 NaN 9.0 43.5 32.0 NaN 3.4
2 NaN 5.0 93.3 83.6 59.5 28.2
3 NaN 19.6 72.8 47.4 31.5 67.2
4 NaN NaN NaN 62.5 NaN 1.8
slide
__值。例如,查看row. = 0
,即first index
l0 a c f
l1 1 2 1 2 1 2
0 NaN NaN 93.4 NaN 19.0 28.9
因为,col - a
中的所有值都是空的。我想先滑动/交换值b/w col - a
和col - c
。然后对right-side
中的列执行相同的操作,即用col-f
替换col-c
中的条目,并使col-f
中的所有条目成为NaN
中的所有条目
l0 a c f
l1 1 2 1 2 1 2
0 93.4 NaN 19.0 28.9 NaN NaN
这实际上是为了节省处理和存储信息的内存,因为互连标签['a', 'b', 'c'...]
不会改变数据的含义。
编辑:(2)的任何想法
我已经设法用下面的代码解决了(1):
for c in df.columns.get_level_values(0).unique():
if df[c].isna().all().all():
df = df.drop(columns=[c])
df
发布于 2019-06-26 04:50:01
您可以使用all
s=df.isnull().all(level=0,axis=1).all()
df.drop(s.index[s],axis=1,level=0)
Out[55]:
a c f
1 2 1 2 1 2
l1
0 NaN NaN 93.4 NaN 19.0 28.9
1 NaN 9.0 43.5 32.0 NaN 3.4
2 NaN 5.0 93.3 83.6 59.5 28.2
3 NaN 19.6 72.8 47.4 31.5 67.2
4 NaN NaN NaN 62.5 NaN 1.8
发布于 2019-06-26 05:09:37
groupby
和filter
df.groupby(axis=1, level=0).filter(lambda d: ~d.isna().all().all())
a c f
1 2 1 2 1 2
0 NaN NaN 93.4 NaN 19.0 28.9
1 NaN 9.0 43.5 32.0 NaN 3.4
2 NaN 5.0 93.3 83.6 59.5 28.2
3 NaN 19.6 72.8 47.4 31.5 67.2
4 NaN NaN NaN 62.5 NaN 1.8
稍微短一点
df.groupby(axis=1, level=0).filter(lambda d: ~np.all(d.isna()))
https://stackoverflow.com/questions/56761731
复制相似问题