使用pandas过滤数据

时间:2016-07-04 12:59:36

标签: python pandas

我有数据

     id       date                  sec        buy
5211153  2016-06-13 18:48:55             119    1  
5211153  2016-06-13 18:50:54              66    0  
5211153  2016-06-13 18:57:09               2    1  
5211154  2016-06-13 18:57:12             118    0  
5211154  2016-06-13 18:59:08              20    0  
5211154  2016-06-13 18:59:34              25    0  
5211154  2016-06-13 18:59:59              11    0  
5211154  2016-06-13 19:00:11              12    1 

我想在buy = 0之前打印buy = 1之前的所有数据。 我试试这段代码

for i, (id, date, buy) in enumerate(zip(ids, dates, buys)):
    if buys[i] == 1:
         print ids[i], dates[i]
         while buys[i-1] != 1:
            print dates[i - 1], buys[i - 1]

但它不是我想要的 欲望输出:

5211153  2016-06-13 18:57:09      1:
5211153  2016-06-13 18:50:54  
5211154  2016-06-13 19:00:11      1:
5211154  2016-06-13 18:57:12   
5211154  2016-06-13 18:59:08     
5211154  2016-06-13 18:59:34    
5211154  2016-06-13 18:59:59   

1 个答案:

答案 0 :(得分:1)

更新:这应该适用于您当前的样本DF,但我不确定您想要在buy列中为备用的0和0做什么(对于例如,如果您在属于同一buy的{​​{1}}列中有以下序列:1,0,1,1,0 - 在这种情况下您希望的输出是什么?)

id

OLD回答:

IIUC你可以这样做:

In [20]: df.sort_values(['id', 'date'],ascending=[1,0])[df.sort_values(['id', 'date'], ascending=[1,0]).groupby('id')['buy'].cumsum() < 2]
Out[20]:
        id                date  sec  buy
2  5211153 2016-06-13 18:57:09    2    1
1  5211153 2016-06-13 18:50:54   66    0
7  5211154 2016-06-13 19:00:11   12    1
6  5211154 2016-06-13 18:59:59   11    0
5  5211154 2016-06-13 18:59:34   25    0
4  5211154 2016-06-13 18:59:08   20    0
3  5211154 2016-06-13 18:57:12  118    0

的产率:

df.loc[(df.buy==0) & (df.buy.shift(-1)==1)]

如果您需要其他内容,请发布所需的数据集

相关问题