pandas DataFrame按行和列过滤

时间:2013-10-06 18:21:23

标签: python pandas dataframe

我有一个python pandas 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',所以最终的df应该是这样的:

                   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')

2 个答案:

答案 0 :(得分: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的{​​{1}}是row_sum的{​​{1}},因此在这种情况下尝试使用columns的值是没有意义的fancy-index到df的行,因为它们的行索引未对齐而且它们无法对齐。

答案 1 :(得分: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