2015-03-12 3 views
0

у меня есть кадр панды данных, как это:разделить определенную панд dataframe в два списка

df = pd.DataFrame(data={'a': [True, True, False, True, True, False,False], 'b': range(7)} , index = range(7)) 

... (индекс не важно), и я хочу, чтобы получить кортеж:

([[0, 1], [3, 4]], [[2],[5, 6]]) 

... или, вообще говоря, я хочу разделить df на кортеж, где первым элементом является список списка значений из столбца b, где == Истина и второй элемент ... где a == False. Порядок в списках должен соответствовать порядку в кадре данных. Что такое самый питонический (или «пандастический») способ получить это? Я не удовлетворен решением.

ответ

0

Вот метод:

df = pd.DataFrame(data={'a': [True, True, False, True, True, False,False], 'b': range(7)} , index = range(7)) 

def splitOnDiscontinuities(elements): 
    lists = [[]] 
    lastE = None 
    for e in elements: 
     if lastE is None or e == lastE + 1: 
      lists[-1].append(e) 
     else: 
      lists.append([e]) 
     lastE = e 
    return lists 

def weirdThing(df, col1, col2): 
    trueElements = splitOnDiscontinuities(list(df[col1][df[col2] == True])) 
    falseElements = splitOnDiscontinuities(list(df[col1][df[col2] == False])) 
    return (trueElements, falseElements) 

print weirdThing(df, 'b', 'a') 

ВЫВОД:

([[0, 1], [3, 4]], [[2], [5, 6]]) 
Смежные вопросы