2015-05-12 3 views
0

Я использую Python 2.7.8 | Anaconda 2.1.0. Я задаюсь вопросом, почему странное поведение ниже происходитСтранное поведение при добавлении столбцов

создать панд dataframe с двумя столбцами, а затем добавить третий столбец путем суммирования первых двух столбцов

x = pd.DataFrame(np.random.randn(5, 2), columns = ['a', 'b']) 
x['c'] = x[['a', 'b']].sum(axis = 1) #or x['c'] = x['a'] + x['b'] 
Out[7]: 
      a   b   c 
0 -1.644246 0.851602 -0.792644 
1 -0.129092 0.237140 0.108049 
2 0.623160 0.105494 0.728654 
3 0.737803 -1.612189 -0.874386 
4 0.340671 -0.113334 0.227337 

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

x[x['c']<0] = 0 
Out[9]: 
      a   b   c 
0 0.000000 0.000000 0.000000 
1 -0.129092 0.237140 0.108049 
2 0.623160 0.105494 0.728654 
3 0.000000 0.000000 0.000000 
4 0.340671 -0.113334 0.227337 

Это дает желаемый результат в колонке 'c', но по каким-то причине столбцов 'a' и 'b' были изменены - я не хочу этого произойдет. Мне было интересно, почему это происходит и как я могу исправить это поведение?

+0

'' x.loc [х [ 'с'] <0, 'с'] = 0'' – joris

ответ

2

Вы должны указать вы хотите только столбец «C»:

x.loc[x['c']<0, 'c'] = 0 

Когда вы только индекс с булевой массива/серии, это будет выбрать полные строки, как вы можете видеть в этом примере:

In [46]: x['c']<0 
Out[46]: 
0  True 
1 False 
2 False 
3  True 
4 False 
Name: c, dtype: bool 

In [47]: x[x['c']<0] 
Out[47]: 
      a   b   c 
0 -0.444493 -0.592318 -1.036811 
3 -1.363727 -1.572558 -2.936285 
1

Поскольку вы устанавливаете ноль для всех столбцов. Вы должны установить его только для столбца c

x['c'][x['c']<0] = 0 
+0

Это прикована индексацией и не гарантируется: HTTP : //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy – EdChum

+0

Спасибо за предложение. Я обязательно проверю. –

+0

Да, как вы его здесь помещаете, он работает, но, например, если вы измените порядок двух '[..]', это не сработает. Поэтому, в общем, всегда лучше использовать 'loc', чтобы быть уверенным – joris

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