2014-02-10 1 views
0

Я хотел бы удалить начальный и конечный нули из каждого события (уровень 1), но не нули, окруженные ненулевыми числами.Удаление строки из иерархической серии в Pandas на основе значения столбца и позиции

следующие работы в поиске и удалении всех нулей:

df = events[event_no][events[event_no] != 0] 

У меня есть следующий иерархический ряд:

1 2/09/2010 0 
     3/09/2010 1.5 
     4/09/2010 4.3 
     5/09/2010 5.1 
     6/09/2010 0 
    2 1/05/2007 53.2 
     2/05/2007 0 
     3/05/2007 21.5 
     4/05/2007 2.5 
     5/05/2007 0 

и хотите:

1 3/09/2010 1.5 
     4/09/2010 4.3 
     5/09/2010 5.1 
    2 1/05/2007 53.2 
     2/05/2007 0 
     3/05/2007 21.5 
     4/05/2007 2.5 

Я прочитал Deleting DataFrame row in Pandas based on column value и Filter columns of only zeros from a Pandas data frame , но не удалось решить эту проблему.

ответ

0

Как выглядит ваш dataframe. Во всяком случае, не имеет никакого значения, просто Логическая индексация должна это сделать:

In [101]:print df 

Out [101]: 
        c1 
first second   
1  2/09/2010 0.0 
     3/09/2010 1.5 
     4/09/2010 4.3 
     5/09/2010 5.1 
     6/09/2010 0.0 
2  1/05/2007 53.2 
     2/05/2007 0.0 
     3/05/2007 21.5 
     4/05/2007 2.5 
     5/05/2007 0.0 


In [102]: 

is_edge=argwhere(hstack((0,diff([item[0] for item in df.index.tolist()])))!=0).flatten() 
is_edge=hstack((is_edge, is_edge-1, 0, len(df)-1)) 
g_idx=hstack(([item for item in argwhere(df['c1']==0).flatten() if item not in is_edge], 
       argwhere(df['c1']!=0).flatten())) 
print df.ix[sorted(g_idx)] 



Out[102]: 
        c1 
first second   
1  3/09/2010 1.5 
     4/09/2010 4.3 
     5/09/2010 5.1 
2  1/05/2007 53.2 
     2/05/2007 0.0 
     3/05/2007 21.5 
     4/05/2007 2.5 

Если у вас есть series вместо dataframe, скажем, серия s, вы можете:

Преобразовать его dataframe:

df=pd.DataFrame(s, columns=['c1']) 

Или:

In [113]: 
is_edge=argwhere(hstack((0,diff([item[0] for item in s.index.tolist()])))!=0).flatten() 
is_edge=hstack((is_edge, is_edge-1, 0, len(s)-1)) 
g_idx=hstack(([item for item in argwhere(s.values==0).flatten() if item not in is_edge], 
       argwhere(s.values!=0).flatten())) 
s[sorted(g_idx)] 
Out[113]: 
first second 
1  3/09/2010  1.5 
     4/09/2010  4.3 
     5/09/2010  5.1 
2  1/05/2007 53.2 
     2/05/2007  0.0 
     3/05/2007 21.5 
     4/05/2007  2.5 
dtype: float64 

BTW, я произвожу серию по:

In [116]: 
tuples=[(1, '2/09/2010'), 
(1, '3/09/2010'), 
(1, '4/09/2010'), 
(1, '5/09/2010'), 
(1, '6/09/2010'), 
(2, '1/05/2007'), 
(2, '2/05/2007'), 
(2, '3/05/2007'), 
(2, '4/05/2007'), 
(2, '5/05/2007')] 
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 
s = pd.Series(array([0.,1.5,4.3,5.1,0.,53.2,0.,21.5,2.5,0.]), index=index) 
s 
Out[116]: 
first second 
1  2/09/2010  0.0 
     3/09/2010  1.5 
     4/09/2010  4.3 
     5/09/2010  5.1 
     6/09/2010  0.0 
2  1/05/2007 53.2 
     2/05/2007  0.0 
     3/05/2007 21.5 
     4/05/2007  2.5 
     5/05/2007  0.0 
dtype: float64 

У меня такая же структура права?

+0

Это не соответствует желаемому выходу OP. «Я хотел бы удалить начальный и конечный нули из каждого события (уровень 1), но не нули, окруженные ненулевыми числами». – DSM

+0

Я пропустил это, не знаю, есть ли более элегантный способ сделать это. Нужно найти края первого уровня независимо от того, что. Это требует, по крайней мере, нескольких строк. –

+0

Это решение требует, чтобы индекс 1-го уровня был численным. –

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