2016-03-14 6 views
0

У меня есть следующие панды мультииндексных dataframe в питонаотфильтровать строки/столбцы с нулевыми значениями в мультииндексных dataframe

   0   1   2   3 
bar one 0.000000 -0.929631 0.688818 -1.264180 
    two 1.130977 0.063277 0.161366 0.598538 
baz one 1.420532 0.052530 -0.701400 0.678847 
    two -1.197097 0.314381 0.269551 1.115699 
foo one -0.077463 0.437145 -0.202377 0.260864 
    two -0.815926 -0.508988 -1.238619 0.899013 
qux one -0.347863 -0.999990 -1.428958 -1.488556 
    two 1.218567 -0.593987 0.099003 0.800736 

Мои вопросы, как я могу отфильтровать:

  1. Столбцы, который содержит нулевые значения - столбец 0, в приведенном выше примере.
  2. С регрессией для фильтрации строк. Как я могу фильтровать строки с нулями: (только один барабан, один) и как я могу фильтровать оба (бар, один) и (бар, два)?

    (Извинения для моего не родного английского языка;)

ответ

5

Чтобы отфильтровать столбцы, содержащие нулевые значений, вы можете использовать

df2 = df.loc[:, (df != 0).all(axis=0)] 

Чтобы отфильтровать строки, которые содержат нулевые значения, вы можете использовать

df2 = df.loc[(df != 0).all(axis=1), :] 

Чтобы отфильтровать строки, вы можете использовать

df2 = df.drop('bar') ## drops both 'bar one' and 'bar two' 
df2 = df.drop(('baz', 'two')) ## drops only 'baz two' 

Например,

import numpy as np 
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])] 
df = pd.DataFrame(np.random.randn(8, 4), index=arrays) 
df.ix['bar','one'][2] = 0 
df = df.loc[:, (df != 0).all(axis=0)] 
df = df.drop('bar') 
df = df.drop(('baz', 'two')) 

#     0   1   3 
# baz one 0.686969 0.410614 0.841630 
# foo one 1.522938 0.555734 -1.585507 
#  two -0.975976 0.522571 -0.041386 
# qux one -0.991787 0.154645 0.179536 
#  two -0.725685 0.809784 0.394708 

Другой способ, если у вас нет значения NaN в вашем dataframe является превратить ваши 0s в NaN и падение столбцы или строки, которые имеют NaN:

df[df != 0.].dropna(axis=1) # to remove the columns with 0 
df[df != 0.].dropna(axis=0) # to remove the rows with 0 

Наконец, если вы хотите сбросить всю строку «бар», если есть один нулевое значение, то вы можете сделать это:

indices = df.loc[(df == 0).any(axis=1), :].index.tolist() ## multi-index values that contain 0 
for ind in indices: 
    df = df.drop(ind[0]) 
+0

@Juilen, большое спасибо за быстрый ответ. С исправлением строк. Как я могу определить строки, содержащие нули. (Забудьте об этом упомянуть в моем вопросе) – Dov

+0

@Dov Я отредактировал свой ответ. Тем не менее, я не знаю, как сейчас фильтровать «bar one» и «bar two», если только одна из двух строк имеет нуль. –

+0

@Dov см. Мое последнее изменение для последнего отсутствующего бита. –

Смежные вопросы