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.valuesdeberí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.valuesydf.valuesestá altamente desacreditado. Mira esto . Además, ens.valuesrealidad es mucho más lento en algunos casos..to_numpyo.arrayestá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, yainque 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=Falseyregex=Falsepara 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.tolistoSeries.any:Series.tolisthace una lista de aSeries, y en el otro solo estoy obteniendo un booleanoSeriesde un regularSeries, luego verificando si hay algunaTrues en el booleanoSeries.fuente
Condición simple:
fuente
Utilizar
Si
xestá 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