2017-02-22 35 views
1

Я пытаюсь получить все записи, где среднее из последних трех строк больше, чем общее среднее для всех строк в отфильтрованном наборе.Фильтрация Pandas Dataframe по средним значениям из последних N

_filtered_d_all = _filtered_d.iloc[:, 0:50].loc[:, _filtered_d.mean()>0.05] 
_last_n_records = _filtered_d.tail(3) 

Что-то вроде этого

_filtered_growing = _filtered_d.iloc[:, 0:50].loc[:, _last_n_records.mean() > _filtered_d.mean()] 

Однако проблема здесь заключается в том, что длина неверное значение. Какие-нибудь советы?

ValueError: Series lengths must match to compare 

Примеры данных

Это имеет индекс на год и месяц, и 2 колонки.

  Col1 Col2 
year month  
2005 12 0.533835 0.170679 
     12 0.494733 0.198347 
2006 3 0.440098 0.202240 
     6 0.410285 0.188421 
     9 0.502420 0.200188 
     12 0.522253 0.118680 
2007 3 0.378120 0.171192 
     6 0.431989 0.145158 
     9 0.612036 0.178097 
     12 0.519766 0.252196 
2008 3 0.547705 0.202163 
     6 0.560985 0.238591 
     9 0.617320 0.199537 
     12 0.343939 0.253855 
+0

ли в виду последние 3 строки в dataframe или предыдущие 3 строк (т.е., если я на строке 5, то она должна быть средством 3,4 и 5)? – RexFuzzle

+0

Да, у вас было бы df = [1, 2, 3, 4, 5, 6, 7] И вы хотите узнать, больше ли среднее из последних трех значений, чем среднее из всех значений в массив (имеет смысл во временном ряду :)) – Eamonn

ответ

1

Почему не только логический индекс непосредственно на фильтрованной DataFrame с

df[df.tail(3).mean() > df.mean()] 

Demo

>>> df 
    0 1 2 3 4 
0 4 8 2 4 6 
1 0 0 0 2 8 
2 5 3 0 9 3 
3 7 5 5 1 2 
4 9 7 8 9 4 

>>> df[df.tail(3).mean() > df.mean()] 
    0 1 2 3 4 
0 4 8 2 4 6 
1 0 0 0 2 8 
2 5 3 0 9 3 
3 7 5 5 1 2 

пример обновления для мультииндексных редактирования

То же ш ould отлично работает для вашего примера MultiIndex, мы просто должны немного маскироваться, конечно.

>>> df 
      col1  col2 
2005 12 -0.340088 -0.574140 
    12 -0.814014 0.430580 
2006 3 0.464008 0.438494 
    6 0.019508 -0.635128 
    9 0.622645 -0.824526 
    12 -1.674920 -1.027275 
2007 3 0.397133 0.659467 
    6 0.026170 -0.052063 
    9 0.835561 0.608067 
    12 0.736873 -0.613877 
2008 3 0.344781 -0.566392 
    6 -0.653290 -0.264992 
    9 0.080592 -0.548189 
    12 0.585642 1.149779 

>>> df.loc[:,df.tail(3).mean() > df.mean()] 
      col2 
2005 12 -0.574140 
    12 0.430580 
2006 3 0.438494 
    6 -0.635128 
    9 -0.824526 
    12 -1.027275 
2007 3 0.659467 
    6 -0.052063 
    9 0.608067 
    12 -0.613877 
2008 3 -0.566392 
    6 -0.264992 
    9 -0.548189 
    12 1.149779 
+0

Аналогичных, но разные ошибки определяются теперь, хотя: ---> 95 _filtered_growing = _filtered_d_all [_last_n_records> _filtered_d_all.mean) (] ValueError: длины серии должен соответствовать – Eamonn

+0

@Eamonn Вы не вызываете среднее значение на '_last_n_records' ... – miradulo

+0

@Eamonn Вам нужно сравнить средства _two_, как и в моем примере. – miradulo

 Смежные вопросы

  • Нет связанных вопросов^_^