2017-01-16 4 views
1

У меня продольные данные следующего видаСравнение строк и предыдущей строки при изменении в пандами dataframe

import pandas as pd 

df = pd.DataFrame({ 
    'a': ['apples', 'plums', 'pears', 'pears', 'pears'], 
    'b': ['grapes', 'grapes', 'grapes', 'grapes', 'bananas'], 
    'c': [0, 0, 1, 0, 1] 
}) 

и функцию, которая сравнивает списки (подробности этого не важны)

def compare(old_fruit, new_fruit): 
    if set(new_fruit) - set(old_fruit) == {'pears'}: 
     return 1 
    else: 
     return 0 

c - 1, когда меняются изменения в a и b, которые меня интересуют. Я хочу найти строки, где c = 1, захватить значения a и b в этот момент, плюс t he значения a и b из предыдущей строки, сравнить их с помощью моей функции и добавить новую серию в dataframe, показывающую результат сравнения.

Для приведенного выше примера, моя требуемая операция выполнения будет compare(['plums', 'grapes'], ['pears', 'grapes']) и compare(['pears', 'grapes'], ['pears', 'bananas']) и добавьте серии [0, 0, 1, 0, 0] к dataframe, т.е. требуемый выход является dataframe следующим образом:

pd.DataFrame({ 
    'a': ['apples', 'plums', 'pears', 'pears', 'pears'], 
    'b': ['grapes', 'grapes', 'grapes', 'grapes', 'bananas'], 
    'c': [0, 0, 1, 0, 1], 
    'd': [0, 0, 1, 0, 0] 
}) 
+2

Пожалуйста, добавьте пример выполнения и нужный результат. – ppasler

+0

Привет. В этом случае желаемый результат представляет собой массив нулей и те же длины, что и dataframe, '[0, 0, 1, 0, 0]', который равен 1, где выполняется функция сравнения, и возвращает 1 и равна 0 в противном случае , Функция 'compare()' возвращает 1 и 0 соответственно для двух приведенных примеров. К сожалению, я не знаю, как написать пример для остальных. – user1684046

+0

Я имею в виду код, который можно скопировать с вашего вопроса, поэтому я могу запустить его на своем компьютере (с фиктивными данными, импортом и желаемым выходом в качестве комментария). – ppasler

ответ

0

Делайте то, что вы хотите сравнить в векторном виде:

df_set = df[['a', 'b']].apply(set, axis=1) 

df_set 
Out[38]: 
0 {grapes, apples} 
1  {grapes, plums} 
2  {grapes, pears} 
3  {grapes, pears} 
4 {bananas, pears} 
dtype: object 

(df_set - df_set.shift()) == {'pears'} 
Out[39]: 
0 False 
1 False 
2  True 
3 False 
4 False 
dtype: bool