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!

0
pythonnewbiebb 5 ene. 2020 a las 02:27

2 respuestas

La mejor respuesta

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
0
Datanovice 5 ene. 2020 a las 01:14

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])
0
Eric Le Fort 4 ene. 2020 a las 23:33