pandas:根据最后一行中的值删除列

时间:2016-05-02 21:34:11

标签: python pandas

从这样的数据开始:

np.random.seed(314)
df = pd.DataFrame({
        'date':[pd.date_range('2016-04-01', '2016-04-05')[r] for r in np.random.randint(0,5,20)], 
        'cat':['ABCD'[r] for r in np.random.randint(0,4,20)], 
        'count': np.random.randint(0,100,20)
})

   cat  count       date
0    B     84 2016-04-04
1    A     95 2016-04-05
2    D     89 2016-04-02
3    D     39 2016-04-05
4    A     39 2016-04-01
5    C     61 2016-04-05
6    C     58 2016-04-04
7    B     49 2016-04-03
8    D     20 2016-04-02
9    B     54 2016-04-01
10   B     87 2016-04-01
11   D     36 2016-04-05
12   C     13 2016-04-05
13   A     79 2016-04-04
14   B     91 2016-04-03
15   C     83 2016-04-05
16   C     85 2016-04-05
17   D     93 2016-04-01
18   C     32 2016-04-02
19   B     29 2016-04-03

接下来,我按date计算总计,将cat转换为列,并计算每列的运行总计:

summary = df.groupby(['date','cat']).sum().unstack().fillna(0).cumsum()

cat            A    B    C   D
date
2016-04-01    80  235   99   0
2016-04-02    85  295  153  14
2016-04-03   111  363  224  14
2016-04-04   111  379  296  50
2016-04-05   111  511  296  50

现在我要删除最后一列小于某个值的列,比如150.结果应如下所示:

cat          B    C 
date
2016-04-01   235   99 
2016-04-02   295  153 
2016-04-03   363  224 
2016-04-04   379  296 
2016-04-05   511  296 

我已经找到了它的一部分:

mask = summary[-1:].squeeze() > 150


       cat
count  A      False
       B       True
       C       True
       D      False

会给我一个删除列的掩码。我无法弄清楚如何通过调用summary.drop(...)来使用它。任何提示?

1 个答案:

答案 0 :(得分:3)

您可以选择所需的列(使用带有布尔索引的掩码),而不是删除您不想要的列:

In [16]: mask = summary[-1:].squeeze() > 220

In [17]: summary.loc[:, mask]
Out[17]:
            count
cat             B      D
date
2016-04-01  141.0   94.0
2016-04-02  235.0   94.0
2016-04-03  235.0  144.0
2016-04-04  326.0  144.0
2016-04-05  384.0  229.0

(我使用了220而不是150,否则选择了所有列)

此外,计算掩码的更好方法可能如下:

mask = summary.iloc[-1] > 220

只选择最后一行(按位置)而不是使用squeeze。