假设我在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。有可能做得更好吗?
答案 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