Dropna By Column by multiindex中的按级别并交换非na值

时间:2019-06-25 20:42:13

标签: python-3.x pandas pandas-groupby multi-index

我正在尝试进行一些转换和卡住。希望有人可以在这里帮助我。

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”。沿着级别= 0(即l0)选择列

  1. 如果全部都是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
  1. 这将给我数据框(如上所示)。 如果之前的所有条目均为空(或相邻列之间的交换值),我想沿行添加slide值。例如查看index = 0,即第一行。
l0    a           c           f      
l1    1     2     1     2     1     2
0   NaN   NaN  93.4   NaN  19.0  28.9

因为,col - a中的所有值都为空。 我想先滑动/交换值黑白col - acol - c。 然后对沿right-side的列进行相同的处理,即用col-c替换col-f中的条目,并使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

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

catchgroupby

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