2013-10-15 3 views
0

Я получил dataframe:панд - проверка состояния для каждой группы в dataframe

df = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': [1,0,0,1,1,0,0,1]}) 

df2 = df.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 
df2['A']['a']['x'][4] = 1 
df2['B']['a']['x'][3] = 1 

variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN 1 1 
4   1 1 NaN NaN NaN NaN 
5   NaN NaN NaN NaN NaN 0 
6   NaN NaN NaN NaN 0 NaN 
7   NaN NaN NaN 1 NaN NaN 

Теперь я хочу, чтобы проверить для одновременного вхождения x == 1 и y == 1, но только в пределах каждой подгруппы, определяемый variable1 и variable2. Таким образом, для приведенного выше кадра данных условие выполняется для index == 4 (группа A-a), но не для index == 3 (группы B-a и B-b).

Я полагаю, что понадобится магия, но я не могу найти правильный путь. Я также пробовал экспериментировать с сложенных dataframe (с использованием df.stack()), но это не получить меня ближе ...

+2

вы цепь присвоившие, бея ch работает в этом случае, но см. [здесь] (http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy), лучше сделать '' df2.loc [ :, ('A', 'a', 'x', 4)] = 1'' – Jeff

ответ

1

Вы можете использовать groupby на 2 первых уровнях variable1 и variable2, чтобы получить сумму x и y колонны на этом уровне:

r = df2.groupby(level=[0,1], axis=1).sum() 

r 
Out[50]: 
variable1 A  B  
variable2 a b a b 
index      
0   1 NaN NaN NaN 
1   NaN 0 NaN NaN 
2   NaN NaN 0 NaN 
3   NaN NaN 1 1 
4   2 NaN NaN NaN 
5   NaN NaN NaN 0 
6   NaN NaN 0 NaN 
7   NaN 1 NaN NaN 

Следовательно, линия вы ищете те, которые содержат значение 2:

r[r==2].dropna(how='all') 
Out[53]: 
variable1 A  B  
variable2 a b a b 
index     
4   2 NaN NaN NaN 
+0

Это выглядит хорошо, но что мне делать при поиске более общего решения? Например, когда у меня есть 'variable3 == x || y || z'? Я знаю, что могу делать магию с числами (например, 'x -> 1',' y -> 2', 'z -> 4', так что каждая комбинация сумм уникальна, но это усложняется ...) –

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