3

我有一个看起来像这样的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')
4

2 回答 2

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

由于indexofrow_sumcolumnsof df,因此在这种情况下尝试使用 的值对row_sum > 0的行进行幻想索引是没有意义的df,因为它们的行索引未对齐且无法对齐。

于 2013-10-06T18:26:05.213 回答
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
于 2017-08-09T20:15:20.210 回答