2014-12-10 2 views
0

색인 및 행에 NaN 값을 포함하는 다중 색인 데이터 프레임이 있습니다.조건에 따라 pandas multiindex 데이터 프레임의 행과 하위를 선택하십시오.

In: 

import pandas as pd 
import numpy as np 

row1 = {'index1' : 'abc', 'col1' : 'some_value', 'col3' : True} 
row2 = {'index2' : 'xyz', 'col2' : 'other_value', 'col3' : np.nan} 
row3 = {'index1' : 'def', 'col1' : 'different_value', 'col3' : False} 
row4 = {'index2' : 'uvw', 'col2' : 'same_value', 'col3' : np.nan} 
df = pd.DataFrame([row1, row2, row3, row4]) 

df.set_index(['index1', 'index2'], inplace=True) 

print(df) 

Out: 

          col1   col2 col3 
index1 index2          
abc NaN   some_value   NaN True 
NaN xyz     NaN other_value NaN 
def NaN  different_value   NaN False 
NaN uvw     NaN same_value NaN 

또한 조건이 보유하고있는 행의 모든 ​​"subrows"를 포함하는 조건 col3 == True하여 해당 dataframe의 하위 집합을 얻을 수있는 가능성이 있습니까? 내가

print(df[df.col3 == True]) 

갈 때

나는 조건이 보유하고있는 행이

     col1 col2 col3 
index1 index2      
abc NaN  some_value NaN True 

를 얻을. 그러나, 내가 무엇을 찾고 있어요 것은 True 값 자체를 가지고 있지만 index1 == abc있는 행의 "subrow"입니다하지 않는 행을 포함하여,

     col1   col2 col3 
index1 index2      
abc NaN  some_value   NaN True 
NaN xyz   NaN other value NaN  

입니다.

그럴 수 있습니까? 아니면 데이터 프레임이 엉망이고 다른 방식으로 구조화되어야합니까?

답변

1

단순한 해결책은 패딩 된 col3에 조건을 사용하는 것입니다. 여기서 NaNs은 속한 행의 값으로 바뀝니다. 예를 들어 :

>>> df['col3'].fillna(method='pad') 

index1 index2 
abc  NaN  True 
NaN  xyz  True 
def  NaN  False 
NaN  uvw  False 
Name: col3, dtype: bool 

이제 당신은 다음과 같은 조건을 적용 할 수

>>> df[df['col3'].fillna(method='pad')] 

       col1  col2   col3 
index1 index2   
abc  NaN  some_value NaN   True 
NaN  xyz  NaN  other_value NaN 
+0

그래! 나는 여전히 할 의도가없는 것을하고 싶다. 그러나 이것은 내 목적을 위해 일한다. – Dirk

+0

네가 데이터를 구조화하는 방식이 이상하게 보입니다. 모든 하위 행에 대해 동일한 index1을 사용해야한다고 생각합니다. 그러면 모든 명시 적으로 보이게 될 것입니다. 그런 다음 groupby/index1로 필터링 할 수 있습니다. 이것이 내가하는 방법이다. 그것은 현재의 방법보다 훨씬 더 효율적이지는 않지만 더 좋아 보일 것입니다. – elyase