更改DataFrame中特定索引的值

时间:2014-01-23 18:52:52

标签: python pandas

假设我在DataFrame中有一系列标志:

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 个答案:

答案 0 :(得分:2)

描述您的功能的更简单方法是x - > 1 - x,这将更有效地应用/ 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

答案 1 :(得分:1)

您可以创建一个翻转值并调用map的dict,这将返回一个序列,您可以创建一个新的数据帧并保持原始原样:

In [6]:

temp={0:1,1:0}

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

Out[6]:

   flag
0     1
1     0
3     1