Estoy tratando de determinar si hay una entrada en una columna Pandas que tenga un valor particular. Traté de hacer esto con if x in df['id']
. Pensé que esto estaba funcionando, excepto cuando le di un valor que sabía que no estaba en la columna 43 in df['id']
que aún devolvía True
. Cuando subconjunto a un marco de datos que solo contiene entradas que coinciden con la identificación faltante df[df['id'] == 43]
, obviamente, no hay entradas en él. ¿Cómo puedo determinar si una columna en un marco de datos de Pandas contiene un valor particular y por qué mi método actual no funciona? (Para su información, tengo el mismo problema cuando uso la implementación en esta respuesta a una pregunta similar).
156
'a' in s.values
debería ser más rápido para series largas.'a' in s
, los pandas eligen verificar el índice en lugar de los valores de la serie? En los diccionarios verifican las claves, pero una serie de pandas debería comportarse más como una lista o matriz, ¿no?s.values
ydf.values
está altamente desacreditado. Mira esto . Además, ens.values
realidad es mucho más lento en algunos casos..to_numpy
o.array
están disponibles en una serie, así que no estoy totalmente seguro de lo que están abogando alternativa (no leo "muy desanimados"). De hecho, dicen que .valores pueden no devolver una matriz numpy, por ejemplo, en el caso de una categórica ... pero está bien, yain
que funcionará como se esperaba (de hecho, más eficientemente que su contraparte de matriz numpy)También puedes usar pandas.Series.isin aunque es un poco más largo que
'a' in s.values
:Pero este enfoque puede ser más flexible si necesita hacer coincidir varios valores a la vez para un DataFrame (consulte DataFrame.isin )
fuente
s.isin(['a']).any()
el
found.count()
testamento contiene varias coincidenciasY si es 0, significa que no se encontró una cadena en la columna.
fuente
na=False
yregex=False
para mi caso de uso, como se explica aquí: pandas.pydata.org/pandas-docs/stable/reference/api/…Hice algunas pruebas simples:
Curiosamente, no importa si buscas 9 o 999999, parece que lleva la misma cantidad de tiempo usar la sintaxis in (debe estar usando la búsqueda binaria)
Parece que usar x.values es el más rápido, pero ¿tal vez hay una forma más elegante en los pandas?
fuente
O use
Series.tolist
oSeries.any
:Series.tolist
hace una lista de aSeries
, y en el otro solo estoy obteniendo un booleanoSeries
de un regularSeries
, luego verificando si hay algunaTrue
s en el booleanoSeries
.fuente
Condición simple:
fuente
Utilizar
Si
x
está presenteid
, devolverá la lista de índices donde está presente, de lo contrario, dará una lista vacía.fuente
No sugiero usar "valor en serie", que puede generar muchos errores. Consulte esta respuesta para más detalles: Uso en operador con series Pandas
fuente
Supongamos que su marco de datos se ve así:
Ahora desea verificar si el nombre de archivo "80900026941984" está presente en el marco de datos o no.
Simplemente puedes escribir:
fuente