Как удалить строки, которые имеют только одну запись в многоиндексном фрейме данных? - PullRequest
4 голосов
/ 19 июня 2019

У меня есть следующий тип данных мути-индекса:


import random
col3=[0,0,0,0,2,4,6,0,0,0,100,200,300,400]
col4=[0,0,0,0,4,6,8,0,0,0,200,900,400, 500]

d = {'Unit': [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6], 
 'Year': [2014, 2015, 2016, 2017, 2015, 2016, 2017, 2017, 2014, 2015, 2014, 2015, 2016, 2017], 'col3' : col3, 'col4' : col4 }
df = pd.DataFrame(data=d)
new_df = df.groupby(['Unit', 'Year']).sum()

           col3  col4     
Unit Year                      
1    2014     0     0      
     2015     0     0       
     2016     0     0      
     2017     0     0      
2    2015     2     4       
     2016     4     6  
     2017     6     8  
3    2017     0     0    
4    2014     0     0      
5    2015     0     0      
6    2014   100   200       
     2015   200   900  
     2016   300   400  
     2017   400   500  

На самом деле это, конечно, больше, но это делает работу. В этом кадре данных я хочу удалить все единицы, которые имеют только один год ввода. Итак, я хочу иметь это:

           col3  col4     
Unit Year                      
1    2014     0     0      
     2015     0     0       
     2016     0     0      
     2017     0     0      
2    2015     2     4       
     2016     4     6  
     2017     6     8         
6    2014   100   200       
     2015   200   900  
     2016   300   400  
     2017   400   500  

Заранее спасибо за помощь,

Джен

1 Ответ

6 голосов
/ 19 июня 2019

Используйте GroupBy.transform с любым столбцом и счетчик проверок с GroupBy.size, сравните для не равных Series.ne и отфильтруйте по boolean indexing:

df = new_df[new_df.groupby(level=0)['col3'].transform('size').ne(1)]

Или получить значения индекса по Index.get_level_values и отфильтровать по Index.duplicated:

df = new_df[new_df.index.get_level_values(0).duplicated(keep=False)]

print (df)
           col3  col4
Unit Year            
1    2014     0     0
     2015     0     0
     2016     0     0
     2017     0     0
2    2015     2     4
     2016     4     6
     2017     6     8
6    2014   100   200
     2015   200   900
     2016   300   400
     2017   400   500
...