2014-01-23 2 views
2

Скажем, у меня есть ряд флагов в DataFrame:Изменения значений более конкретные показатели в 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) 

он отлично работает, но есть две проблемы: во-первых, что это сделать s изменения в месте, в то время как я хотел бы новую серию в DataFrame. В конце концов, это не имеет большого значения.

Второй момент заключается в том, что он не кажется достаточно пифоническим. Можно ли сделать лучше?

ответ

2

простой способ описать ваш функция как x -> 1 - x, это будет более эффективно, если применить/map.

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

Примечание: Я хотел бы использовать iloc здесь, как это менее неоднозначно.

Если вы хотите, чтобы назначить эти Inplace затем выполнить явное задание:

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

Вы можете создать Dict, который щелкает значений и вызов карты, заносить бы ряд, и вы можете создать новую dataframe и оставить оригинал нетронутым:

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

Мне нравится это, но у меня есть вопрос, который я не знаю, как это исправить: новый dataframe содержит только значный изменен , в то время как я хочу оба. Изменен и не изменился. – user2988577

Смежные вопросы