¿Cómo creo una nueva columna basada en las condiciones de otras columnas en pandas?

Tengo un dataframe de pandas en el que quiero crear nuevas columnas, cuyos valores se basan en valores de otras tres columnas.

Primero creamos la columna y solo le dimos un valor aleatorio 300:

data['stability'] = 300 

Entonces puse a punto las condiciones:

 data['stability'][(data['wind_speed'] <= 3) & (data['clouds']  3) & (data['clouds'] = 5) & (data['clouds'] < 4 ) & (data['dagnacht'] == 'nacht')] = 4 data['stability'][(data['wind_speed'] = 4 ) & (data['dagnacht'] == 'nacht')] = 5 data['stability'][(data['wind_speed'] > 3) & (data['clouds'] >= 4 ) & (data['dagnacht'] == 'nacht')] = 4 

Si verifica si existe la condición, le dice que existen las condiciones: entrada:

 data['stability'][(data['wind_speed'] > 3) & (data['clouds'] >= 4 ) & (data['dagnacht'] == 'nacht')] 

salida:

 2011-08-04 21:00:00 300.0 2011-08-04 22:00:00 300.0 2011-08-04 23:00:00 300.0 2011-08-05 00:00:00 300.0 2011-08-05 01:00:00 300.0 2011-08-05 02:00:00 300.0 2011-08-05 03:00:00 300.0 2011-08-05 04:00:00 300.0 2011-08-05 05:00:00 300.0 2011-08-06 23:00:00 300.0 2011-08-07 00:00:00 300.0 2011-08-07 01:00:00 300.0 

Pero como pueden ver, todavía tenía el valor de 300 que le di al principio, y no el valor 4 que quiero tener ahora. value_counts me da 300 como el único valor Por alguna razón, puede leer a condición pero no asigna el nuevo valor a estabilidad.

Estoy trabajando con python 2.7 y pandas 0.18.0

Mi conjunto de datos se ve así:

  wind_speed clouds stability dagnacht date 2016-03-21 19:00:00 4.73 7 300.0 nacht 2016-03-21 19:10:00 4.58 NaN 300.0 nacht 2016-03-21 19:20:00 4.75 NaN 300.0 nacht 2016-03-21 19:30:00 3.67 NaN 300.0 nacht 2016-03-21 19:40:00 3.41 NaN 300.0 nacht 2016-03-21 19:50:00 3.61 NaN 300.0 nacht 2016-03-21 20:00:00 3.31 8 300.0 nacht 2016-03-21 20:10:00 3.30 NaN 300.0 nacht 2016-03-21 20:20:00 3.39 NaN 300.0 nacht 2016-03-21 20:30:00 3.59 NaN 300.0 nacht 2016-03-21 20:40:00 3.24 NaN 300.0 nacht 2016-03-21 20:50:00 2.99 NaN 300.0 nacht 2016-03-21 21:00:00 3.04 7 300.0 nacht 2016-03-21 21:10:00 3.01 NaN 300.0 nacht 2016-03-21 21:20:00 2.63 NaN 300.0 nacht 2016-03-21 21:30:00 2.41 NaN 300.0 nacht 2016-03-21 21:40:00 2.42 NaN 300.0 nacht 2016-03-21 21:50:00 2.49 NaN 300.0 nacht 2016-03-21 22:00:00 2.31 8 300.0 nacht 2016-03-21 22:10:00 2.24 NaN 300.0 nacht 2016-03-21 22:20:00 1.89 NaN 300.0 nacht 2016-03-21 22:30:00 1.88 NaN 300.0 nacht 2016-03-21 22:40:00 1.83 NaN 300.0 nacht 2016-03-21 22:50:00 1.83 NaN 300.0 nacht 2016-03-21 23:00:00 1.86 8 300.0 nacht 2016-03-21 23:10:00 2.29 NaN 300.0 nacht 2016-03-21 23:20:00 2.53 NaN 300.0 nacht 2016-03-21 23:30:00 2.36 NaN 300.0 nacht 2016-03-21 23:40:00 2.04 NaN 300.0 nacht 2016-03-21 23:50:00 1.83 NaN 300.0 nacht 

Gracias de antemano por la ayuda

Estás realizando indexación encadenada , cambia tus líneas a esta forma:

 data.loc[(data['wind_speed'] > 3) & (data['clouds'] >= 4 ) & (data['dagnacht'] == 'nacht'), 'stability'] = 4 

Así que opera en una vista de sus datos en lugar de una copia

 In [19]: data.loc[(data['wind_speed'] > 3) & (data['clouds'] >= 4 ) & (data['dagnacht'] == 'nacht'), 'stability'] = 4 data Out[19]: wind_speed clouds stability dagnacht date 2016-03-21 19:00:00 4.73 7.0 4.0 nacht 2016-03-21 19:10:00 4.58 NaN 300.0 nacht 2016-03-21 19:20:00 4.75 NaN 300.0 nacht 2016-03-21 19:30:00 3.67 NaN 300.0 nacht 2016-03-21 19:40:00 3.41 NaN 300.0 nacht 2016-03-21 19:50:00 3.61 NaN 300.0 nacht 2016-03-21 20:00:00 3.31 8.0 4.0 nacht 2016-03-21 20:10:00 3.30 NaN 300.0 nacht 2016-03-21 20:20:00 3.39 NaN 300.0 nacht 2016-03-21 20:30:00 3.59 NaN 300.0 nacht 2016-03-21 20:40:00 3.24 NaN 300.0 nacht 2016-03-21 20:50:00 2.99 NaN 300.0 nacht 2016-03-21 21:00:00 3.04 7.0 4.0 nacht 2016-03-21 21:10:00 3.01 NaN 300.0 nacht 2016-03-21 21:20:00 2.63 NaN 300.0 nacht 2016-03-21 21:30:00 2.41 NaN 300.0 nacht 2016-03-21 21:40:00 2.42 NaN 300.0 nacht 2016-03-21 21:50:00 2.49 NaN 300.0 nacht 2016-03-21 22:00:00 2.31 8.0 300.0 nacht 2016-03-21 22:10:00 2.24 NaN 300.0 nacht 2016-03-21 22:20:00 1.89 NaN 300.0 nacht 2016-03-21 22:30:00 1.88 NaN 300.0 nacht 2016-03-21 22:40:00 1.83 NaN 300.0 nacht 2016-03-21 22:50:00 1.83 NaN 300.0 nacht 2016-03-21 23:00:00 1.86 8.0 300.0 nacht 2016-03-21 23:10:00 2.29 NaN 300.0 nacht 2016-03-21 23:20:00 2.53 NaN 300.0 nacht 2016-03-21 23:30:00 2.36 NaN 300.0 nacht 2016-03-21 23:40:00 2.04 NaN 300.0 nacht 2016-03-21 23:50:00 1.83 NaN 300.0 nacht 

Se debe haber generado una advertencia si intentaste tu código:

 In [21]: data['stability'][(data['wind_speed'] > 3) & (data['clouds'] >= 4 ) & (data['dagnacht'] == 'nacht')] = 4 data C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\IPython\kernel\__main__.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy if __name__ == '__main__':