{"id":2213,"date":"2020-07-09T18:49:54","date_gmt":"2020-07-09T23:49:54","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=2213"},"modified":"2020-09-30T13:53:39","modified_gmt":"2020-09-30T18:53:39","slug":"uso-de-query-con-pandas-en-python","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/uso-de-query-con-pandas-en-python\/","title":{"rendered":"Filtrado y uso de query con Pandas en Python"},"content":{"rendered":"<p>Veremos ejemplos de uso de query con Pandas en Python, as\u00ed como las diferentes formas de hacer filtrado en un dataset empleando Pandas. Utilizaremos las siguientes operaciones de Pandas: unique, isin, contains, sort_values, groupby, apply, y to_csv.<\/p>\n<p><!--more--><\/p>\n<p>\u00c9ste art\u00edculo cuenta con una explicaci\u00f3n en video. Lo puedes ver aqu\u00ed:\u00a0<a href=\"https:\/\/youtu.be\/0DpbPTG4358\" target=\"_blank\" rel=\"noopener\">https:\/\/youtu.be\/0DpbPTG4358<\/a><\/p>\n<p>Un aspecto importante en el an\u00e1lisis de datos es realizar correctamente el filtrado de un dataset. Veamos las diferentes formas de hacer el filtrado en Pandas.<\/p>\n<p>En los siguientes ejemplos hacemos uso del siguiente conjunto de datos:<\/p>\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/1i5s30GCPTqg07N4JU7T2l0Uu6lY7LU_z\/view?usp=sharing\" target=\"_blank\" rel=\"noopener\">https:\/\/drive.google.com\/file\/d\/1i5s30GCPTqg07N4JU7T2l0Uu6lY7LU_z\/view?usp=sharing<\/a><\/p>\n<h2>Filtrar por columna<\/h2>\n<p>Podemos seleccionar toda una columna. Para esto \u00fanicamente debemos incluir entre corchetes el nombre de la columna a seleccionar.<\/p>\n<pre class=\"lang:python decode:true \">print (df[\"county\"])<\/pre>\n<p>Pero si deseamos unas cuantas filas \u00fanicamente, podemos especificar el rango:<\/p>\n<pre class=\"lang:python decode:true\">print (df[\"county\"][5:10]) # imprime de la linea 5 a la 10\r\nprint (df[\"county\"][:10]) # imprime  las primeras 10\r\nprint (df[\"county\"][-5:]) # imprime las \u00faltimas 5.\r\n\r\n<\/pre>\n<p>Nota: podemos escribir directamente el nombre de la columna sin los corchetes. La primera de las l\u00edneas de c\u00f3digo anteriores, quedar\u00eda as\u00ed:<\/p>\n<pre class=\"lang:python decode:true\">print (df.county[5:10])<\/pre>\n<p>Para los siguientes ejemplos haremos uso de un dataframe llamado df3, \u00a0que contiene las columnas \u00abcondado\u00bb, \u00abcandidato\u00bb, \u00abpartido\u00bb y \u00abvotos\u00bb.<\/p>\n<pre class=\"lang:python decode:true \">df3 = df[[\"county\", \"candidate\", \"party\", \"votes\"]]<\/pre>\n<h2>Filtrar con condiciones<\/h2>\n<p>Para filtrar con condiciones, debemos escribir la condici\u00f3n dentro de corchetes. Por ejemplo, si deseamos mostrar a los que tienen m\u00e1s de 200 mil votos en un condado, podemos escribir:<\/p>\n<pre class=\"lang:python decode:true \">print (df3[df3.votes&gt;200000])<\/pre>\n<p>Lo anterior nos crea una matriz de valores booleanos True o False, de acuerdo a la condici\u00f3n expresada (<em>df3.votes&gt;200000<\/em>). \u00c9sta matriz es pasada al dataframe df3.<\/p>\n<h2>Filtrar con dos condiciones<\/h2>\n<p>Si tenemos dos condiciones a cumplir, cada condici\u00f3n la ponemos dentro de par\u00e9ntesis y las unimos usando un operador l\u00f3gico (&amp;, |). En el siguiente ejemplo deseamos mostrar los votos obtenidos por el partido dem\u00f3crata en el condado de Manhattan.<\/p>\n<pre class=\"lang:python decode:true \">print (df3[(df3.county=='Manhattan') &amp; (df.party=='Democrat')])<\/pre>\n<h2>Uso de Query con Pandas en Python<\/h2>\n<p>Vamos a realizar la misma consulta (mostrar los votos obtenidos por el partido dem\u00f3crata en el condado de Manhattan) pero usando el m\u00e9todo query.<\/p>\n<pre class=\"lang:python decode:true \">print (df3.query(\"county=='Manhattan' and party=='Democrat'\"))<\/pre>\n<p>La diferencia radica en que solo se especifica el nombre de la columna y todo va entre comillas como si se tratara de una cadena.<\/p>\n<h2>Manejo de variables y uso de query con Pandas<\/h2>\n<p>Podemos incluir una variable dentro del query. En el ejemplo anterior deseamos que Manhattan est\u00e9 dentro de una variable llamada \u00abcondado\u00bb. Entonces el query quedar\u00eda as\u00ed:<\/p>\n<pre class=\"lang:python decode:true \">condado = 'Manhattan'\r\nprint (df3.query(\"county==@condado and party=='Democrat'\"))<\/pre>\n<h2>isin y uso de query con pandas<\/h2>\n<p>Isin nos permite comprobar si un valor est\u00e1 dentro de una lista. Por ejemplo, si la consulta fuese: \u00abMostrar los votos de los condados de Autauga y Baldwin\u00bb, si lo quisi\u00e9ramos hacer con dos condiciones quedar\u00eda as\u00ed:<\/p>\n<pre class=\"lang:python decode:true \">#1 Usando matriz de valores booleanos\r\nprint (df3[(df3.county=='Autauga') | (df3.county=='Baldwin')])\r\n\r\n\r\n#2 Usando query\r\nprint (df3.query(\"county=='Autauga' or county=='Baldwin'\"))<\/pre>\n<p>Observamos que se realizan dos consultas, una por cada valor buscado. Pero como es la misma columna, podemos utilizar el m\u00e9todo isin:<\/p>\n<pre class=\"lang:python decode:true \">print (df3[(df3.county.isin([\"Autauga\",\"Baldwin\"]))])<\/pre>\n<p>Y obtendremos los mismos resultados.<\/p>\n<h2>Contains<\/h2>\n<p>Si la consulta requiere que comprobemos solo parte del valor del dato, podemos utilizar contains en el caso de las cadenas de caracteres. Por ejemplo, si deseamos mostrar los votos de los condados que contengan la palabra\u00a0\u00a0&#8216;Saint&#8217;, podemos hacer lo siguiente:<\/p>\n<pre class=\"lang:python decode:true \">print (df3[df3.county.str.contains('Saint')])<\/pre>\n<p>Lo que nos devolver\u00e1 valores correspondientes a Saint Francisc, Saint Agatha, y Saint Laurence.<\/p>\n<h2>Ordenamiento en Pandas<\/h2>\n<p>\u00bfQui\u00e9nes fueron los 3 candidatos que m\u00e1s votos obtuvieron\u00a0\u00a0en un condado? Para contestar \u00e9sta pregunta debemos realizar una operaci\u00f3n de ordenamiento. De esa forma podemos extraer los 3 primeros resultados que nos arroje Pandas.<\/p>\n<p>C\u00f3digo:<\/p>\n<pre class=\"lang:python decode:true \">dfordenado = df3.sort_values(by=\"votes\", ascending=False)\r\nprint (\"Ordenados por votos de mayor a menor\")\r\nprint (dfordenado.head(3))<\/pre>\n<p>Le estamos diciendo que al dataframe de nombre <em>df3<\/em>, lo ordene (<em>sort_values<\/em>) con base en la columna \u00ab<em>votes<\/em>\u00ab, en forma descendente (<em>ascending=False<\/em>). Como solo deseamos 3, utilizamos <em>head(3)<\/em> para obtener solo los tres primeros.<\/p>\n<h2>Agrupamiento en Pandas<\/h2>\n<p>El agrupamiento nos permitir\u00e1 realizar operaciones (como contar o sumar) sobre un subgrupo dentro de un dataframe. Por ejemplo, si deseamos el \u00a0total de votos por estado y por partido, tendr\u00edamos que agrupar todos los votos de un estado, y despu\u00e9s agrupar todos los votos de cada partido. Hacerlo con Pandas es muy sencillo:<\/p>\n<pre class=\"lang:python decode:true\">#print (\"total de votos por estado y por partido\")\r\n#print (df.groupby([\"state\", \"party\"]).sum())<\/pre>\n<p>\u00c9sta operaci\u00f3n nos agrupa todos los registros, primero por estado y luego por partido y realiza la suma de las columnas num\u00e9ricas, si solo queremos \u00a0la de votos deber\u00edamos especificarla:\u00a0<em>df.groupby([\u00abstate\u00bb, \u00abparty\u00bb])[\u00abvotes\u00bb].sum()<\/em><\/p>\n<h2>Aplicar una funci\u00f3n a una columna en Pandas<\/h2>\n<p>C\u00f3digo:<\/p>\n<pre class=\"lang:python decode:true\">def miles(x):\r\n\treturn x\/1000\r\n\r\ndf3[\"votesm\"] = df3[\"votes\"].apply(miles)\r\nprint (df3.head())<\/pre>\n<p>Primero estamos creando una funci\u00f3n llamada miles que recibe un valor (x), y lo regresa dividido entre 1000. (return x\/1000).<\/p>\n<p>Luego creamos una columna llamada \u00abvotesm\u00bb y le asignamos el resultado de aplicar a cada valor de \u00abvotes\u00bb la funci\u00f3n miles.<\/p>\n<p>El resultado se ver\u00e1 as\u00ed:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2218\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply.png\" alt=\"uso de query con pandas apply\" width=\"343\" height=\"88\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply.png 1146w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply-300x77.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply-768x197.png 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/07\/uso-de-query-con-pandas-apply-1024x263.png 1024w\" sizes=\"auto, (max-width: 343px) 100vw, 343px\" \/><\/a><\/p>\n<h2>Guardar un dataset como csv<\/h2>\n<p>Para guardar un dataset como csv, debemos especificar el nombre del archivo donde se guardar\u00e1n los datos y hacer uso del m\u00e9todo to_csv.<\/p>\n<pre class=\"lang:python decode:true \">df3.to_csv(\"filename_df3.csv\", index=False)<\/pre>\n<p>\u00c9ste art\u00edculo est\u00e1 explicado en v\u00eddeo. Te lo dejo a continuaci\u00f3n:<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/0DpbPTG4358\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veremos ejemplos de uso de query con Pandas en Python, as\u00ed como las diferentes formas de hacer filtrado en un dataset empleando Pandas. Utilizaremos las siguientes operaciones de Pandas: unique, isin, contains, sort_values, groupby, apply, y to_csv.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[301],"tags":[287,307,306],"class_list":["post-2213","post","type-post","status-publish","format-standard","hentry","category-curso-python-analisis-datos","tag-curso-python","tag-filtrado-en-pandas","tag-pandas-en-python"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=2213"}],"version-history":[{"count":9,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2213\/revisions"}],"predecessor-version":[{"id":2277,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2213\/revisions\/2277"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=2213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=2213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=2213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}