我有一个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')
答案 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