2015-12-20 4 views
-1

Я хотел бы ресэмплировать этот DataFrame:Resample на основе значения столбца

import pandas as pd 
from StringIO import StringIO 

mycsv = StringIO(""" 
time;A;B 
2015-12-06T22:00:00.000000Z;1.08703;1.1 
2015-12-07T22:00:05.000000Z;1.08682;2.1 
2015-12-07T22:00:05.000000Z;1.08682;3.5 
2015-12-08T22:01:20.000000Z;1.08683;5.8 
2015-12-09T22:01:30.000000Z;1.08676;6.1 
2015-12-10T00:03:00.000000Z;1.08675;7.3 
2015-12-06T22:03:50.000000Z;1.08676;12.0 
""") 
df = pd.read_csv(mycsv, delimiter=';', parse_dates=True, index_col='time', header=0) 

каждый раз, когда последнее значение столбца только < = 4 * к, где к целое, то есть я хочу этот результат:

time;A;B 
2015-12-07T22:00:05.000000Z;1.08682;3.5  # 3.5 is the last value <= 4.0 
2015-12-10T00:03:00.000000Z;1.08675;7.3  # 7.3 is the last vakue <= 8.0 
2015-12-06T22:03:50.000000Z;1.08676;12.0  # 1é.0 is the last value <= 12.0 

Как это сделать с пандами, т.е. частоты дискретизации на основе состояния на колонке?

+0

Каков ваш метод передискретизации? Похоже, вы просто берете последнюю строку, которая соответствует вашему критерию, и ничего не делает с другими строками, которые соответствуют критерию. – Evert

+0

@Evert yes Я хочу сохранить номер строки: 'max {i такой, что B [i] <= 4}', 'max {i такой, что B [i] <= 8}', 'max {i такой, что B [i] <= 12} 'и т. д. – Basj

+0

Не слишком Panda-esque, но цикл над' k' на самом деле звучит проще всего. – Evert

ответ

2

Вы хотите GroupBy деление без остатка //:

In [11]: df.B // 4 
Out[11]: 
time 
2015-12-06 22:00:00 0 
2015-12-07 22:00:05 0 
2015-12-07 22:00:05 0 
2015-12-08 22:01:20 1 
2015-12-09 22:01:30 1 
2015-12-10 00:03:00 1 
2015-12-06 22:03:50 3 
Name: B, dtype: float64 

In [12]: df.groupby(df.B // 4).last() 
Out[12]: 
     A  B 
B 
0 1.08682 3.5 
1 1.08675 7.3 
3 1.08676 12.0 
-1

Я бы сначала удалить те, которые> 4, то дискретизацию с последним:

In [11]: df[df["B"] <= 4] 
Out[11]: 
          A B 
time 
2015-12-06 22:00:00 1.08703 1.1 
2015-12-07 22:00:05 1.08682 2.1 
2015-12-07 22:00:05 1.08682 3.5 

In [12]: df[df["B"] <= 4].resample("5min", "last") 
... 

Если вы не хотите, чтобы все время в середине, вы должны использовать GroupBy, а не Resample:

In [21]: df[df["B"] < 4].groupby(level=0).last() 
Out[21]: 
          A B 
time 
2015-12-06 22:00:00 1.08703 1.1 
2015-12-07 22:00:05 1.08682 3.5 
+0

Кажется, что есть недоразумение: это не дает желаемого результата (см. Конец моего вопроса). – Basj