2014-01-23 68 views
2

比方說,我有標誌的系列在數據幀:更改值在具體指標

a=pd.DataFrame({'flag':[0,1,0,0,1]}) 

,我要改變的是在一個特定的索引標記的值:

lind=[0,1,3] 

這是一個簡單的解決方案:

def chnflg(series,ind): 
    if series.ix[ind]==0: 
     series.ix[ind]=1 
    else: 
     series.ix[ind]=0 

map(partial(chnflg,a),lind) 

它工作正常,但有兩個問題:第一個是,它使在原地發生了變化,而我想在DataFrame中添加一個新的系列。畢竟這不是什麼大問題。

第二點是它似乎不夠pythonic。有沒有可能做得更好?

回答

2

更簡單的方法來描述你的功能作爲x - > 1 - x,這將更適用於apply/map。

In [11]: 1 - a.iloc[lind] 
Out[11]: 
    flag 
0  1 
1  0 
3  1 

注:我喜歡在這裏使用iloc,因爲它不太模糊。

如果你想分配這些就地然後做了明確劃分:

In [12]: a.iloc[lind] = 1 - a.iloc[lind] 

In [13]: a 
Out[13]: 
    flag 
0  1 
1  0 
2  0 
3  1 
4  1 
+0

我想要所有的值(更改和不變),而不是就地。在這種情況下,我可以解決使用您的解決方案:a ['nflag'] = a ['flag'],然後使用您的就地解決方案 – user2988577

1

您可以創建一個翻轉值並調用地圖的字典,這將返回一個系列,你可以創建一個新的數據框並保持原來的不變:

In [6]: 

temp={0:1,1:0} 

pd.DataFrame(a.ix[lind]['flag'].map(temp)) 

Out[6]: 

    flag 
0  1 
1  0 
3  1 
+0

我喜歡這一點,但我有我不知道如何解決它的問題:新的數據框只包含尊貴的改變,而我想要兩個。已更改並保持不變。 – user2988577