Tengo un marco de datos que contiene 16 columnas. Mi objetivo es devolver una columna 17 que contiene todos los nombres de columna en formato de lista o tupla si la celda contiene un cierto valor. El propósito es almacenar eficientemente los datos de una pregunta de encuesta de selección múltiple para que los métodos .explode de Python o UNNEST de SQL puedan usarse para contar los elementos en la columna 17.

Un conjunto de datos de muestra:

| Q1    |  Q2   |  Q3   |
|-------|-------|-------|
| True  | True  | False |
| False | True  | True  |
| True  | True  | False |

Lo que me gustaría devolver:

| Q1    |  Q2   |  Q3   |   List   |
|-------|-------|-------|----------|
| True  | True  | False | [Q1, Q2] |
| False | True  | True  | [Q2, Q3] |
| True  | True  | False | [Q1, Q2] |

Estoy abierto a otras soluciones si no estoy pensando en este tema de la manera correcta.

1
Essem 186F 7 may. 2020 a las 17:44

4 respuestas

Suponiendo que puede crear esta lista 2 desde DataFrame iterando el DF

quarters = ["Q1","Q2","Q3"]
data = [[True, True, False],[False, True, True], [True,True,False]]

qlist = []
slist = []
for item in data:
    slist = []
    for i,c in enumerate(item):
        if (c):
            slist.append(quarters[i])
    qlist.append(slist)
print(qlist)



 Output:
 ['Q1', 'Q2'], ['Q2', 'Q3'], ['Q1', 'Q2']]

Puede repetir este resultado para actualizar la última columna. HTH

0
RMS 7 may. 2020 a las 15:25

Prueba este enfoque

df = pd.DataFrame([[True,True,False],[True,False,True],[False,True,True]], 
columns = 
['q1','q2','q3'])

dict_map = {i:col for i,col in enumerate(df.columns)}

def check(x):    
   s = []
   for v,i in zip(x.values,x.index):
     if v: s.append(dict_map[i])
   return s

df['calc'] = df.apply(check).values

Usted consigue

      q1     q2       q3    calc
 0  True    True    False   [q1, q2]
 1  True    False   True    [q1, q3]
 2  False   True    True    [q2, q3]
0
umbreon29 7 may. 2020 a las 15:11

Iré con una forma clásica de python. Espero que pueda obtener sus datos en un diccionario llamado data como este ...

data={'Q1':['True','False','True'], 'Q2':['True','True','True'], 'Q3':['False','True','False']}
output = []
for i in range(len(data)):
    z=[]
    for j in data:
        if data[j][0] == 'True':
            z.append(j)
    output.append(z)
print(output)
# [['Q1', 'Q2'], ['Q2', 'Q3'], ['Q1', 'Q2']]
0
Darkknight 7 may. 2020 a las 15:12

Puede usar csv.DictReader y hacer algo como esto:

import csv

my_data = csv.DictReader(input_file)
for row in all_rows:
    # ... do stuff based on row 
    new_col = []
    for col in my_data.fieldnames:
        # do stuff in the column
        if row[col] is True:
            new_col.append(col)

Al final, si necesita agregar esa columna a la tabla existente, deberá hacer una copia del original my_data y agregar new_col

0
Mache 7 may. 2020 a las 15:16