2017-01-16 57 views
1

我有以下形式比较时改变行和前一行中的熊猫数据帧

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当我感兴趣的ab发生变化时。我想查找c = 1的行,在此时获取ab的值,再加上t他的值为前一行中的ab,使用我的函数进行比较,并向数据框中添加一个显示比较结果的新系列。

对于上面的例子中,我所期望的操作将执行compare(['plums', 'grapes'], ['pears', 'grapes'])compare(['pears', 'grapes'], ['pears', 'bananas']),并添加系列[0, 0, 1, 0, 0]到数据帧,即所期望的输出是一个数据框如下:

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

嗨。期望的输出是一个零数组,其长度与数据帧长度相同,在这种情况下为[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