微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

解决方法:

用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

由于row_sum的索引是df的列,因此在这种情况下尝试使用row_sum>的值是没有意义的. 0到fancy-index到df行,因为它们的行索引没有对齐而且它们不能对齐.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐