2017-09-01 56 views
0

我有这样的数据帧:熊猫使用外部变量应用功能

V1 V2  
1 1  
0 0  
0 0  
0 0  
1 0  
1 1  
0 1 

我需要比较称为comienzo一个变量中的每个V1V2行值,并设置名为第三列标签下面这个函数:

def labeling(DataFrame): 
    comienzo=0 #flag to indicate event started (1= started, 0= no started)  
    for n in range(len(DataFrame)): 
     if ((DataFrame.iloc[n]['V1']==1 & DataFrame.iloc[n]['V2']==1) & comienzo == 0) : 
      comienzo=1 
      DataFrame['Label']='Start' 
     elif ((DataFrame.iloc[n]['V1']==0 & DataFrame.iloc[n]['V2']==0) & comienzo == 1) : 
      comienzo=0 
      DataFrame['Label']='End' 
    return DataFrame 

我想要做的使用这pandorable。所以,我想这一点:

def labeling(x, comienzo): 
    if ((x['V1']==1 & x['V2']==1) & comienzo == 0) : 
     comienzo=1 
     Label='Start' 
    elif ((x['V1']==0 & x['V2']==0) & comienzo == 1) : 
     comienzo=0 
     Label='End' 
    return Label 

comienzo=0 #I initialize 'comienzo' var to 0 
DataFrame['Label']=DataFrame.apply(labmda x: labeling(x,comienzo),axis=1) 

这项工作,但值不正确,我认为.apply不考虑变量comienzo

是否有可能使此代码变得可怜?

我想这样的输出:

comienzo=0 
V1 V2  
1 1 Start comienzo=1  
0 1 NaN  
0 0 End comienzo=0  
0 0 NaN  
1 0 NaN  
1 1 Start comienzo=1  
1 1 NaN  
0 1 NaN    
+0

您是否试过 - '.apply(label,args =(comienzo,),axis = 1'? –

+0

不,我不需要每行的_comienzo_值用于下一行 –

回答

0

您有一系列的小失误,从不当使用的λ(拉姆达拼写错误),不使用带有ARGS正确应用(如上所述),和我漂亮确定你的意思是在你的条件逻辑中使用'和'而不是&。

另外你的输入数据是7行,而你理想的输出是8行,这使得试图通过映射输入 - >输出在技术上不可能解决问题。

不过,我认为这是你正在尝试以获得:

DataFrame = pd.DataFrame(
     [[1,1], 
     [0,1], 
     [0,0], 
     [0,0], 
     [1,0], 
     [1,1], 
     [0,1]]) 
DataFrame.columns=['V1','V2'] 
DataFrame.insert(0, 'comienzo', 0) 

def labeling(x): 
    global comienzo 
    if ((x['V1']==1 and x['V2']==1) and comienzo == 0) : 
     comienzo=1 
     return('s') 
    elif ((x['V1']==0 and x['V2']==0) and comienzo == 1) : 
     comienzo=0 
     return('end') 

comienzo=0 
DataFrame['Label']=DataFrame.apply(labeling,axis=1) 

注意,通过使用一个全球性的comienzo,我们可以通过保存它的值应用迭代。

尽管在很多情况下使用全局变量是不好的做法。在这里进一步阅读:Why is it not possible to access other variables from inside the apply function in Python?

+0

'与'运算符和'&'运算符有什么区别?谢谢我知道现在调用全局变量。您的回答是100%对我有用。 –

+0

这是一个很好的解释:https://stackoverflow.com/问题/ 22646463 /差异之间和布尔与vs-bit-in-python-why-difference-i 基本上'和'通常是你想要的,而且是用于更复杂的比较 PS:如果你喜欢我的答案,请接受它,所以我得到的荣誉:) –

+0

我是新手在这里在堆栈中rflow。我该如何接受你的回答?当我点击uparrow投票系统显示我时:“感谢您的反馈!记录下名声低于15的人的投票记录,但不要更改公开显示的帖子分数。”当然,我喜欢你的答案。谢谢。 –