Datos de ejemplo:

dd = pd.DataFrame({
    'file': ['file1','file2','file3','file4','file5','file6','file7','file8','file9'],
    'prop1': [True,False,False,False,False,False,False,False,False],
    'prop2': [False,False,False,False,False,False,False,True,False],
    'prop3': [False,True,False,True,False,True,False,False,True]
})
file    prop1   prop2   prop3
0   file1   True    False   False
1   file2   False   False   True
2   file3   False   False   False
3   file4   False   False   True
4   file5   False   False   False
5   file6   False   False   True
6   file7   False   False   False
7   file8   False   True    False
8   file9   False   False   True

Necesito cortar (después de cortar, no deberían estar en el marco de datos 'dd') todas las filas con valores de apoyo falsos (en el archivo de ejemplo 3, 5, 7) a otro nuevo marco de datos

0
Contra111 9 oct. 2019 a las 14:35

3 respuestas

La mejor respuesta

Utilice DataFrame.any para probar al menos uno True por columnas con nombres de columnas en la lista:

mask = dd[['prop1','prop2','prop3']].any(axis=1)

O todas las columnas sin primero:

mask = dd.iloc[:, 1:].any(axis=1)

O con columnas con prop en los nombres de columna:

mask = dd.filter(like='prop').any(axis=1)

df1 = dd[mask]

Si necesita eliminar filas, use ~ para invertir la máscara booleana:

df2 = dd[~mask]

print (df1)
    file  prop1  prop2  prop3
0  file1   True  False  False
1  file2  False  False   True
3  file4  False  False   True
5  file6  False  False   True
7  file8  False   True  False
8  file9  False  False   True

print (df2)
    file  prop1  prop2  prop3
2  file3  False  False  False
4  file5  False  False  False
6  file7  False  False  False
1
jezrael 9 oct. 2019 a las 11:45

Aplicación simple de las leyes de Morgan usando any y todos

Obtener las líneas que no tienen False

Necesita DataFrame.any

dd[dd[['prop1','prop2','prop3']].any(axis=1)]

O utilizando DataFrame.all:

dd[~(~dd[['prop1','prop2','prop3']]).all(axis=1)]

Salida:

    file  prop1  prop2  prop3
0  file1   True  False  False
1  file2  False  False   True
3  file4  False  False   True
5  file6  False  False   True
7  file8  False   True  False
8  file9  False  False   True

Obteniendo las líneas que tienen False

dd[~dd[['prop1','prop2','prop3']].any(axis=1)]

O utilizando DataFrame.all:

dd[(~dd[['prop1','prop2','prop3']]).all(axis=1)]

Salida:

    file  prop1  prop2  prop3
2  file3  False  False  False
4  file5  False  False  False
6  file7  False  False  False
1
ansev 9 oct. 2019 a las 11:56
print(dd.loc[set(dd.index) - set(dd.query('prop1 == False and prop2 == False and prop3 == False ').index), :])

    file  prop1  prop2  prop3
0  file1   True  False  False
1  file2  False  False   True
3  file4  False  False   True
5  file6  False  False   True
7  file8  False   True  False
8  file9  False  False   True
0
Divya Dass 9 oct. 2019 a las 11:47
58303225