2013-10-06 5 views
2

у меня есть питон панд DataFrame который выглядит следующим образом:панды DataFrame фильтр строк и столбцов

    A  B  C ...  ZZ 
2008-01-01 00 NaN NaN NaN ...  1 
2008-01-02 00 NaN NaN NaN ... NaN 
2008-01-03 00 NaN NaN  1 ... NaN 
...    ... ... ... ... ... 
2012-12-31 00 NaN  1 NaN ... NaN 

, и я не могу понять, как получить подмножество DataFrame где есть один или более " 1' в нем, так что окончательное ДФ должно быть что-то вроде этого:

    B  C ...  ZZ 
2008-01-01 00 NaN NaN ...  1 
2008-01-03 00 NaN  1 ... NaN 
...    ... ... ... ... 
2012-12-31 00 1  NaN ... NaN 

Это, удаляя все строки и столбцы, которые не имеют 1 в нем.

я попробовать это, который, кажется, чтобы удалить строки, не 1:

df_filtered = df[df.sum(1)>0] 

И в попытке удалить столбцы с:

df_filtered = df_filtered[df.sum(0)>0] 

но получаю эту ошибку после того, как во второй строке:

IndexingError('Unalignable boolean Series key provided') 

ответ

5

Сделайте это с помощью loc:

In [90]: df 
Out[90]: 
    0 1 2 3 4 5 
0 1 NaN NaN 1 1 NaN 
1 NaN NaN NaN NaN NaN NaN 
2 1 1 NaN NaN 1 NaN 
3 1 NaN 1 1 NaN NaN 
4 NaN NaN NaN NaN NaN NaN 

In [91]: df.loc[df.sum(1) > 0, df.sum(0) > 0] 
Out[91]: 
    0 1 2 3 4 
0 1 NaN NaN 1 1 
2 1 1 NaN NaN 1 
3 1 NaN 1 1 NaN 

Вот почему вы получите эту ошибку:

Допустим, у меня есть следующий кадр, df, (по аналогии с вашими):

In [112]: df 
Out[112]: 
    a b c d e 
0 0 1 1 NaN 1 
1 NaN NaN NaN NaN NaN 
2 0 0 0 NaN 0 
3 0 0 1 NaN 1 
4 1 1 1 NaN 1 
5 0 0 0 NaN 0 
6 1 0 1 NaN 0 

Когда я просуммировать по строкам и порога в 0, Я получаю:

In [113]: row_sum = df.sum() 

In [114]: row_sum > 0 
Out[114]: 
a  True 
b  True 
c  True 
d False 
e  True 
dtype: bool 

Поскольку index из row_sum является columns из df, в этом случае не имеет смысла пытаться использовать значения row_sum > 0 для индекса fancy в строках df, так как их индексы строк не выровнены, и они не могут быть выровнены.

0

Альтернативно, чтобы удалить все строки или столбцы NaN, вы также можете использовать .any().

In [1680]: df 
Out[1680]: 
    0 1 2 3 4 5 
0 1.0 NaN NaN 1.0 1.0 NaN 
1 NaN NaN NaN NaN NaN NaN 
2 1.0 1.0 NaN NaN 1.0 NaN 
3 1.0 NaN 1.0 1.0 NaN NaN 
4 NaN NaN NaN NaN NaN NaN 

In [1681]: df.loc[df.any(axis=1), df.any(axis=0)] 
Out[1681]: 
    0 1 2 3 4 
0 1.0 NaN NaN 1.0 1.0 
2 1.0 1.0 NaN NaN 1.0 
3 1.0 NaN 1.0 1.0 NaN 
Смежные вопросы