2017-02-21 18 views
0

У меня есть нечетная структура данных, которая имеет два уровня заголовка. Первый уровень составляет заголовок столбца, а второй составляет первую строку данных. Как это:Отбрасывать несколько столбцов на основе разных значений в первой строке dataframe

 Fav-fruit Unnamed1  Unnamed2 Cost Purchsd? Unnamed3 
0 Apples  Bananas  Pears    Yes  No 
1 Apples        0.10    No 
2        Pears  0.30    No 
3 Apples        0.10 Yes 

Я хочу бросить набор столбцов на основе заголовка второго уровня (то есть в строке 0). Например, чтобы удалить столбцы с Apples и Pears в строке 0, чтобы получить это:

 Fav-fruit Cost Purchsd? Unnamed3 
0 Pears    Yes  No 
1     0.10    No 
2 Pears  0.30    No 
3     0.10 Yes 

Реальный dataframe имеет около 500 столбцов и мне нужно отказаться от около 60 из них. Я не хочу продвигать строку 0, чтобы стать новым набором заголовков столбцов, потому что я не хочу потерять текущие заголовки.

Есть ли простой способ сделать это?

ответ

1

Вы можете использовать boolean indexing с loc, булева маской создается путем переворачивания (~) и isin, для выбора первой строки использует iloc:

mask = df.iloc[0].isin(['Apples','Pears']) 
print (mask) 
Fav-fruit  True 
Unnamed1  False 
Unnamed2  True 
Cost   False 
Purchsd?  False 
Unnamed3  False 
Name: 0, dtype: bool 

print (~mask) 
Fav-fruit False 
Unnamed1  True 
Unnamed2  False 
Cost   True 
Purchsd?  True 
Unnamed3  True 
Name: 0, dtype: bool 

print (df.loc[:, ~mask]) 
    Unnamed1 Cost Purchsd? Unnamed3 
0 Bananas NaN  Yes  No 
1  NaN 0.1  NaN  No 
2  NaN 0.3  NaN  No 
3  NaN 0.1  Yes  NaN 
+0

идеальных! Это работает. У меня проблемы с индексированием головы, но это объяснение действительно помогло. Спасибо! – user4896331