Digamos que tengo el siguiente marco de datos:
¿Cuál es la forma más eficiente de actualizar los valores de las columnas feat y another_feat donde el flujo es el número 2 ?
Es esto?
for index, row in df.iterrows():
if df1.loc[index,'stream'] == 2:
# do something
ACTUALIZACIÓN: ¿Qué hacer si tengo más de 100 columnas? No quiero nombrar explícitamente las columnas que quiero actualizar. Quiero dividir el valor de cada columna por 2 (excepto la columna de flujo).
Entonces, para tener claro cuál es mi objetivo:
Dividir todos los valores por 2 de todas las filas que tienen el flujo 2, pero sin cambiar la columna del flujo
100
columnas de alguna manera. por ejemplo, si necesita las100
primeras columnas, usedf.columns[:100]
y luego pase aloc
.Puedes hacer lo mismo con
.ix
, así:In [1]: df = pd.DataFrame(np.random.randn(5,4), columns=list('abcd')) In [2]: df Out[2]: a b c d 0 -0.323772 0.839542 0.173414 -1.341793 1 -1.001287 0.676910 0.465536 0.229544 2 0.963484 -0.905302 -0.435821 1.934512 3 0.266113 -0.034305 -0.110272 -0.720599 4 -0.522134 -0.913792 1.862832 0.314315 In [3]: df.ix[df.a>0, ['b','c']] = 0 In [4]: df Out[4]: a b c d 0 -0.323772 0.839542 0.173414 -1.341793 1 -1.001287 0.676910 0.465536 0.229544 2 0.963484 0.000000 0.000000 1.934512 3 0.266113 0.000000 0.000000 -0.720599 4 -0.522134 -0.913792 1.862832 0.314315
EDITAR
Después de la información adicional, lo siguiente devolverá todas las columnas, donde se cumple alguna condición, con valores reducidos a la mitad:
>> condition = df.a > 0 >> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)
¡Espero que esto ayude!
fuente
condition = (df.a == -1.001287)
esperando que los valores se dividieran de la fila dondea == -1.001287
obtuve un marco de datos vacío.df.iloc[1,0]
. O mejor aún, establezca el valor usted mismo y vuelva a intentarlo:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
condition = (df.a == -1.001287)
no funciona?ix
ahora está en desuso.