Quiero llamar a una lista de subpreguntas que están estructuradas de la misma manera (por ejemplo, E1_1, E1_2, E1_3, etc.) en un ciclo for. Mi objetivo es reemplazar todas las instancias de 0 en estas subpreguntas por un valor faltante (Ninguno) en función de si un encuestado indicó que se suponía que debía responder a la pregunta principal (por ejemplo, si df ['EOPS'] es igual a 1, esto significa que un encuestado indicó que está respondiendo preguntas 'E') y que si no respondieron a la pregunta principal (por ejemplo, si 'E1' no fue respondida, 'E1_1', 'E1_2', 'E1_3', etc. deberían recodificarse como NaNs)
Código:
df = pd.DataFrame([[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], columns=['EOPS', 'E1', 'E1_1', 'E1_2', 'E1_3', 'E2', 'E2_1', 'E2_2', 'E2_3', 'E3', 'E3_1', 'E3_2', 'E3_3'])
list_of_questions = ['E1', 'E2', 'E3'] # each question in list has associated questions 'E1_1', 'E1_2', 'E1_3', 'E2_1', 'E2_2', 'E2_3', etc.
for question in list_of_questions:
for i in range(1,3):
if df['E1'] == 0 & df['EOPS'] == 1:
df['E1_`i''] = np.where(data_final['E1_`i''] == 0, None, data_final['E1_`i''])
¿Cómo puedo llamar a las subpreguntas en este ciclo? Para aquellos familiarizados con Stata, esto se haría con citas `'
como lo hice anteriormente alrededor de i
, pero me pregunto si se puede hacer lo mismo en Python.
Lo que espero lograr es esto:
df = pd.DataFrame([[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, None, None, None, None, None, None, None, None, None, None, None, None]], columns=['EOPS', 'E1', 'E1_1', 'E1_2', 'E1_3', 'E2', 'E2_1', 'E2_2', 'E2_3', 'E3', 'E3_1', 'E3_2', 'E3_3'])
¡Gracias!
2 respuestas
Sin necesidad de bucle, podemos aprovechar .any
y .loc
para asignar a sus columnas en el lugar
Por ejemplo
import numpy as np
cols = df.iloc[:,1:].columns.tolist()
df.loc[((df[cols] == 0).all(axis=1)) & (df['EOPS'] == 1), cols] = np.nan
Otro método para seleccionar sus columnas:
cols = df.filter(regex='E\d+').columns
Resultado:
EOPS E1 E1_1 E1_2 E1_3 E2 E2_1 E2_2 E2_3 E3 E3_1 E3_2 E3_3
0 1 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0
1 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
No estoy completamente seguro según su pregunta, pero sospecho que zip
es lo que está buscando:
a = [1,2,3]
b = ["a", "b", "c"]
for x, y in zip(a, b):
print(x, y)
Daré:
1 a
2 b
3 c
Otro enfoque que ofrece los mismos resultados sin zip
(sin embargo, debe usar zip
, los iteradores son generalmente mejores):
a = [1,2,3]
b = ["a", "b", "c"]
for i, x in enumerate(a):
print(x, b[i])
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.