pandas https://interactivechaos.ovh/es es pandas.DataFrame.rank https://interactivechaos.ovh/es/python/function/pandasdataframerank <span class="field field--name-title field--type-string field--label-hidden">pandas.DataFrame.rank</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 15/01/2021 - 16:44</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.DataFrame.rank</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>DataFrame.rank(<br />     axis=0,<br />     method='average',<br />     numeric_only=None,<br />     na_option='keep',<br />     ascending=True,<br />     pct=False<br /> )</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>El método <strong>rank</strong> de un DataFrame pandas devuelve otro DataFrame pandas en el que los valores son el resultado de asignar rangos (desde 1 hasta n) a los valores del DataFrame original considerándolos ordenados, por defecto, de menor a mayor a lo largo del eje 0. Es decir, el menor valor de una columna recibe el rango 1, el siguiente el 2, etc. El parámetro <em>method</em> controla el método de asignación de rangos a valores coincidentes.</p> <p>El índice del DataFrame original se mantiene. Los rangos asignados son números reales.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>axis</strong>: (<em>0</em> o <em>"index"</em> -valor por defecto-, <em>1</em> o <em>"columns" </em>) Eje a lo largo del cual se calculan los rangos.</li> <li><strong>method</strong>: (<em>"average"</em> -valor por defecto-, <em>"min"</em>, <em>"max"</em>, <em>"first"</em>, <em>"dense"</em>) Criterio para asignar rangos a valores coincidentes. Estos criterios parten de los rangos que se asignarían al grupo de valores si cada valor recibiese un rango distinto (véanse ejemplos más adelante). <ul><li><em>"average"</em>: (Valor por defecto) devuelve el valor medio de los rangos que se asignarían al grupo.</li> <li><em>"min"</em>: Valor mínimo del grupo. El siguiente valor (fuera del grupo) recibe como rango el asignado al grupo + n, siendo n el número de elementos del grupo.</li> <li><em>"max"</em>: Valor máximo del grupo.</li> <li><em>"first"</em>: Rangos asignados según el orden en el que los valores aparecen en la serie.</li> <li><em>"dense"</em>: semejante a <em>"min"</em> pero el siguiente valor (fuera del grupo) recibe como rango el asignado al grupo + 1.</li> </ul></li> <li><strong>na_option</strong>: (<em>"keep"</em> -valor por defecto-, <em>"top"</em>, <em>"bottom"</em>). Controla la gestión de los valores nulos: <ul><li><em>"keep"</em>: Asigna el rango NaN a los valores NaN.</li> <li><em>"top"</em>: Asigna el menor rango a los valores NaN.</li> <li><em>"bottom"</em>: Asigna el mayor rango a los valores NaN.</li> </ul></li> <li><strong>ascending</strong>: (Booleano, <em>True</em> por defecto). Si toma el valor <em>True</em> los rangos se asignarán de menor a mayor valor (el menor valor recibirá el rango 1.0).</li> <li><strong>pct</strong>: (Booleano, <em>False</em> por defecto). Controla si los rangos se mostrarán con formato de fracción.</li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>El método <em>pandas.DataFrame.rank</em> devuelve un DataFrame pandas.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Para probar este método, generemos un DataFrame formado por valores numéricos aleatorios:</p> <div class="codigo"> <p>import numpy as np<br /> import pandas as pd</p> </div> <div class="codigo"> <p>np.random.seed(0)</p> </div> <div class="codigo"> <p>df = pd.DataFrame(np.random.randint(0, 10, size = (4, 5)), index = list("ABCD"))<br /> df</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0055.jpg"><img alt="DataFrame" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-ebcfa39b-66a7-41bb-99c7-6ae5fe4c8472" data-insert-attach="{&quot;id&quot;: &quot;ebcfa39b-66a7-41bb-99c7-6ae5fe4c8472&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0055.jpg" /></a></p> <p>Ahora ejecutamos el método con sus parámetros por defecto:</p> <div class="codigo"> <p>df.rank()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0056.jpg"><img alt="Rangos obtenidos" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-3ce9f519-7b1f-43f1-9b62-c8ed45f26786" data-insert-attach="{&quot;id&quot;: &quot;3ce9f519-7b1f-43f1-9b62-c8ed45f26786&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0056.jpg" /></a></p> <p>Observamos que, por defecto, los rangos se han asignado a lo largo del eje 0 (eje vertical). La columna 1 estaba formada por valores crecientes (0, 3, 6 y 7), por lo que los rangos asignados son 1.0, 2.0, 3.0 y 4.0, respectivamente.</p> <p>En la columna 0 el menor valor es el 5 (índice <em>"A"</em>), que recibe el rango 1.0. El siguiente valor -considerándolos de menor a mayor- es el número 6 (índice <em>"D"</em>) que recibe el rango 2.0.</p> <p>En la columna 4 hay dos valores 1. Si recibiesen rangos diferentes, al tratarse de los valores más bajos, recibirían los rangos 1.0 y 2.0 (o viceversa, es indiferente), por lo que se muestran en el resultado con el valor medio de dichos rangos (1.5).</p> <p>Algo semejante observamos en la columna 3, en la que hay dos valores 8 (los más elevados) que recibirían los rangos 3 y 4 (si los rangos asignados fuesen diferentes), motivo por el que reciben el rango 3.5.</p> </div> <div class="field__item"><p>Si, en el ejemplo anterior, quisiéramos modificar el comportamiento para los valores repetidos, podríamos hacerlo añadiendo el parámetro <em>method</em>. Por ejemplo, podríamos asignar el menor rango (de los que se asignarían si los rangos fuesen diferentes) con el siguiente código:</p> <div class="codigo"> <p>df.rank(method = "min")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0057.jpg"><img alt="DataFrame" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-62aeb126-7390-4ced-bb27-526e221f785a" data-insert-attach="{&quot;id&quot;: &quot;62aeb126-7390-4ced-bb27-526e221f785a&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0057.jpg" /></a></p> <p>En este caso, los dos valores 1 presentes en la columna 4 han recibido un rango de 1.0 (que es el menor de los rangos 1.0 y 2.0 que se asignarían si los rangos fuesen distintos). Vemos, sin embargo, que ningún número ha recibido el rango 2.0.</p> </div> <div class="field__item"><p>Si deseásemos que la asignación de rangos a valores iguales fuese la determinada por el parámetro <em>"min"</em> visto pero se realizase sin dejar huecos, podríamos conseguirlo asignando el valor <em>"dense"</em> al parámetro <em>method</em>:</p> <div class="codigo"> <p>df.rank(method = "dense")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0058.jpg"><img alt="DataFrame" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-4468dcf9-6cb4-464a-b099-d132ab613097" data-insert-attach="{&quot;id&quot;: &quot;4468dcf9-6cb4-464a-b099-d132ab613097&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0058.jpg" /></a></p> <p>Vemos que los dos valores 1 de la columna 4 siguen recibiendo el rango 1.0, pero el siguiente rango asignado es ahora 2.0.</p> </div> <div class="field__item"><p>El parámetro <em>ascending</em> controla la forma de asignar rangos: suponiendo los valores ordenados de menor a mayor (valor por defecto) u ordenados de mayor a menor, lo que podemos controlar de la siguiente forma:</p> <div class="codigo"> <p>df.rank(ascending = False)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0059.jpg"><img alt="Rangos asignados de mayor a menor" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-c5abfdf0-09e3-40b4-912e-520d0edf940c" data-insert-attach="{&quot;id&quot;: &quot;c5abfdf0-09e3-40b4-912e-520d0edf940c&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0059.jpg" /></a></p> <p>Ahora los rangos 1.0 se asignan a los mayores valores de cada columna.</p> </div> <div class="field__item"><p>Si quisiéramos que los rangos se asignasen a lo largo del eje horizontal, bastaría con especificar el eje 1 (o "<em>index"</em>) en el parámetro <em>axes</em>:</p> <div class="codigo"> <p>df</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0055.jpg"><img alt="DataFrame" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-ebcfa39b-66a7-41bb-99c7-6ae5fe4c8472" data-insert-attach="{&quot;id&quot;: &quot;ebcfa39b-66a7-41bb-99c7-6ae5fe4c8472&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0055.jpg" /></a></p> <div class="codigo"> <p>df.rank(axis = 1)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0060.jpg"><img alt="Rangos asignados a lo largo del eje horizontal" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-3409f79b-c912-4837-8a42-9915306ec7da" data-insert-attach="{&quot;id&quot;: &quot;3409f79b-c912-4837-8a42-9915306ec7da&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0060.jpg" /></a></p> <p>Ahora, la fila <em>"A"</em> que estaba compuesta por los valores 5, 0, 3, 3, 7 recibe los rangos 4.0, 1.0, 2.5, 2.5 y 5.0. El número 0 -el menor de todos- es el que ha recibido el rango 1.0. Los valores 3 que aparecen dos veces reciben el rango 2.5 (media de 2.0 y 3.0).</p> </div> <div class="field__item"><p>Este método no solo se aplica a valores numéricos. Carguemos en la variable <em>df</em> 5 registros aleatorios extraídos del dataset <em>titanic</em> que podemos descargar de la librería seaborn:</p> <div class="codigo"> <p>import seaborn as sns</p> </div> <div class="codigo"> <p>titanic = sns.load_dataset("titanic").sample(5)<br /> titanic</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0061.jpg"><img alt="Dataset Titanic" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-0b462566-ca05-4a91-b78c-d6c9825dee73" data-insert-attach="{&quot;id&quot;: &quot;0b462566-ca05-4a91-b78c-d6c9825dee73&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0061.jpg" /></a></p> <p>Si ahora aplicamos el método <em>rank</em> vemos que todas las columnas reciben rangos:</p> <div class="codigo"> <p>titanic.rank()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0062.jpg"><img alt="Rangos asignados al Dataset Titanic" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-0687ac31-80d9-4175-9cb9-b2a3ad7db1a4" data-insert-attach="{&quot;id&quot;: &quot;0687ac31-80d9-4175-9cb9-b2a3ad7db1a4&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0062.jpg" /></a></p> </div> <div class="field__item"><p>Podemos seleccionar solo las columnas numéricas con el parámetro <em>numeric_only</em>:</p> <div class="codigo"> <p>titanic.rank(numeric_only = True)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0063.jpg"><img alt="Rangos asignados a las columnas numéricas del Dataset Titanic" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-67f2521c-4ced-4468-9efa-8823e594f4d7" data-insert-attach="{&quot;id&quot;: &quot;67f2521c-4ced-4468-9efa-8823e594f4d7&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0063.jpg" /></a></p> </div> </div> </div> Fri, 15 Jan 2021 15:44:48 +0000 admin 2940 at https://interactivechaos.ovh pandas.Series.rank https://interactivechaos.ovh/es/python/function/pandasseriesrank <span class="field field--name-title field--type-string field--label-hidden">pandas.Series.rank</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 15/01/2021 - 10:07</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.Series.rank</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>Series.rank(<br />     axis=0,<br />     method='average',<br />     numeric_only=None,<br />     na_option='keep',<br />     ascending=True,<br />     pct=False<br /> )</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>El método <strong>rank</strong> de una serie pandas devuelve otra serie pandas en la que los valores son el resultado de asignar rangos (desde 1 hasta n) a los valores de la serie original considerándolos ordenados, por defecto, de menor a mayor. Es decir, el menor valor recibe el rango 1, el siguiente el 2, etc. El parámetro <em>method</em> controla el método de asignación de rangos a valores coincidentes.</p> <p>El índice de la serie original se mantiene. Los rangos asignados son números reales.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>axis</strong>: (<em>0</em> o <em>"index"</em>) Eje a lo largo del cual se calculan los rangos. Solo está permitido el valor 0 o <em>"index"</em> (valor por defecto), no la opción <em>1</em> (o <em>"columns"</em>), reservada para DataFrames</li> <li><strong>method</strong>: (<em>"average"</em> -valor por defecto-, <em>"min"</em>, <em>"max"</em>, <em>"first"</em>, <em>"dense"</em>) Criterio para asignar rangos a valores coincidentes. Estos criterios parten de los rangos que se asignarían al grupo de valores si cada valor recibiese un rango distinto (véanse ejemplos más adelante) <ul><li><em>"average"</em>: (Valor por defecto) devuelve el valor medio de los rangos que se asignarían al grupo</li> <li><em>"min"</em>: Valor mínimo del grupo. El siguiente valor (fuera del grupo) recibe como rango el asignado al grupo + n, siendo n el número de elementos del grupo</li> <li><em>"max"</em>: Valor máximo del grupo</li> <li><em>"first"</em>: Rangos asignados según el orden en el que los valores aparecen en la serie</li> <li><em>"dense"</em>: semejante a <em>"min"</em> pero el siguiente valor (fuera del grupo) recibe como rango el asignado al grupo + 1</li> </ul></li> <li><strong>na_option</strong>: (<em>"keep"</em> -valor por defecto-, <em>"top"</em>, <em>"bottom"</em>). Controla la gestión de los valores nulos: <ul><li><em>"keep"</em>: Asigna el rango NaN a los valores NaN</li> <li><em>"top"</em>: Asigna el menor rango a los valores NaN</li> <li><em>"bottom"</em>: Asigna el mayor rango a los valores NaN.</li> </ul></li> <li><strong>ascending</strong>: (<em>bool</em>, <em>True</em> por defecto). Si toma el valor <em>True</em> los rangos se asignarán de menor a mayor valor (el menor valor recibirá el rango 1.0).</li> <li><strong>pct</strong>: (<em>bool</em>, <em>False</em> por defecto) Controla si los rangos se mostrarán con formato de fracción.</li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>El método <strong>rank</strong> de una serie pandas devuelve otra serie pandas.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Si partimos de una serie pandas formada por los valores 3, 6, 2 y 8:</p> <div class="codigo"> <p>s = pd.Series([3, 6, 2, 8], index = list("ABCD"))<br /> s</p> </div> <div class="respuesta"> <p>A    3<br /> B    6<br /> C    2<br /> D    8<br /> dtype: int64</p> </div> <p>...podemos obtener los rangos de estos valores aplicando el método <em>rank</em>:</p> <div class="codigo"> <p>s.rank()</p> </div> <div class="respuesta"> <p>A    2.0<br /> B    3.0<br /> C    1.0<br /> D    4.0<br /> dtype: float64</p> </div> <p>Como vemos, el valor más bajo de la serie original (2, cuyo índice era "C") ha recibido el rango 1.0. El siguiente -considerados de menor a mayor (3, cuyo índice era "A")- ha recibido el rango 2.0, etc.</p> <p>Comprobamos también que los rangos son números reales.</p> </div> <div class="field__item"><p>Si hay valores repetidos, por defecto se devuelve el valor medio de los rangos que éstos recibirían si se asignasen rangos diferentes. Por ejemplo:</p> <div class="codigo"> <p>s = pd.Series([3, 6, 2, 3], index = list("ABCD"))<br /> s</p> </div> <div class="respuesta"> <p>A    3<br /> B    6<br /> C    2<br /> D    3<br /> dtype: int64</p> </div> <div class="codigo"> <p>s.rank()</p> </div> <div class="respuesta"> <p>A    2.5<br /> B    4.0<br /> C    1.0<br /> D    2.5<br /> dtype: float64</p> </div> <p>Si se hubiesen asignado rangos diferentes, los valores 3 (índices <em>"A"</em> y <em>"D"</em>) habrían recibido los rangos 2.0 y 3.0 (o 3.0 y 2.0, es indiferente), por lo que su valor medio es 2.5.</p> </div> <div class="field__item"><p>Si quisiéramos que los valores repetidos recibiesen, por ejemplo, el rango mínimo de los que recibirían en el caso de asignarse rangos distintos, podemos hacer uso del parámetro <em>method</em>:</p> <div class="codigo"> <p>s.rank(method = "min")</p> </div> <div class="respuesta"> <p>A    2.0<br /> B    4.0<br /> C    1.0<br /> D    2.0<br /> dtype: float64</p> </div> <p>Como hemos visto en el ejemplo anterior, los valores 3 recibirían los rangos 2.0 y 3.0, por lo que su valor mínimo es 2.0. Obsérvese que, con este criterio, ningún valor recibe el rango 3.0 y que el siguiente valor fuera del grupo (el valor 6 cuyo índice es <em>"B"</em>) recibe el siguiente rango disponible (4.0).</p> </div> <div class="field__item"><p>Si deseásemos cambiar el comportamiento mostrado en el ejemplo anterior podemos aplicar como método <em>"dense"</em>:</p> <div class="codigo"> <p>s.rank(method = "dense")</p> </div> <div class="respuesta"> <p>A    2.0<br /> B    3.0<br /> C    1.0<br /> D    2.0<br /> dtype: float64</p> </div> <p>En este caso los valores repetidos reciben el rango mínimo (2.0), pero el siguiente valor fuera del rango (el valor 6 de índice <em>"B"</em>) recibe el siguiente rango (3.0).</p> </div> <div class="field__item"><p>Es posible controlar el orden de asignación de los rangos con el parámetro <em>ascending</em>:</p> <div class="codigo"> <p>s = pd.Series([3, 6, 2, 8], index = list("ABCD"))<br /> s</p> </div> <div class="respuesta"> <p>A    3<br /> B    6<br /> C    2<br /> D    8<br /> dtype: int64</p> </div> <div class="codigo"> <p>s.rank(ascending = False)</p> </div> <div class="respuesta"> <p>A    3.0<br /> B    2.0<br /> C    4.0<br /> D    1.0<br /> dtype: float64</p> </div> <p>Comprobamos que, en este caso, es el mayor valor (el valor 8 de índice <em>"D"</em>) el que recibe el rango 1.0.</p> </div> <div class="field__item"><p>Si la serie original incluye NaN's, por defecto reciben como rango NaN's:</p> <div class="codigo"> <p>s = pd.Series([3, np.nan, 6, 2, 8, np.nan], index = list("ABCDEF"))<br /> s</p> </div> <div class="respuesta"> <p>A    3.0<br /> B    NaN<br /> C    6.0<br /> D    2.0<br /> E    8.0<br /> F    NaN<br /> dtype: float64</p> </div> <div class="codigo"> <p>s.rank()</p> </div> <div class="respuesta"> <p>A    2.0<br /> B    NaN<br /> C    3.0<br /> D    1.0<br /> E    4.0<br /> F    NaN<br /> dtype: float64</p> </div> </div> <div class="field__item"><p>Si quisiéramos que los NaN's recibiesen un rango numérico, podemos hacer uso del parámetro <em>na_option</em>. Si éste toma el valor <em>"top"</em>, los NaN's reciben el rango más bajo:</p> <div class="codigo"> <p>s.rank(na_option = "top")</p> </div> <div class="respuesta"> <p>A    4.0<br /> B    1.5<br /> C    5.0<br /> D    3.0<br /> E    6.0<br /> F    1.5<br /> dtype: float64</p> </div> <p>Vemos que los dos NaN's han recibido el rango 1.5 (valor medio de 1.0 y 2.0, pues ya sabemos que, por defecto, el criterio de asignación para valores coincidentes es <em>"average"</em>).</p> </div> <div class="field__item"><p>Si se asigna al parámetro <em>pct</em> el valor True, los rangos se asignan con formato de fracción:</p> <div class="codigo"> <p>s = pd.Series([3, 6, 2, 8], index = list("ABCD"))<br /> s</p> </div> <div class="respuesta"> <p>A    3<br /> B    6<br /> C    2<br /> D    8<br /> dtype: int64</p> </div> <div class="codigo"> <p>s.rank()</p> </div> <div class="respuesta"> <p>A    2.0<br /> B    3.0<br /> C    1.0<br /> D    4.0<br /> dtype: float64</p> </div> <div class="codigo"> <p>s.rank(pct = True)</p> </div> <div class="respuesta"> <p>A    0.50<br /> B    0.75<br /> C    0.25<br /> D    1.00<br /> dtype: float64</p> </div> </div> </div> </div> Fri, 15 Jan 2021 09:07:07 +0000 admin 2938 at https://interactivechaos.ovh pandas.crosstab https://interactivechaos.ovh/es/python/function/pandascrosstab <span class="field field--name-title field--type-string field--label-hidden">pandas.crosstab</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 13/11/2020 - 10:17</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.crosstab</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>pandas.crosstab(<br />     index,<br />     columns,<br />     values = None,<br />     rownames = None,<br />     colnames = None,<br />     aggfunc = None,<br />     margins = False,<br />     margins_name = 'All',<br />     dropna = True,<br />     normalize = False<br /> )</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>La función <strong>pandas.crosstab</strong> devuelve la tabla de contingencia resultante de cruzar dos o más campos de un dataframe. Aunque, por defecto, el resultado evalúa las frecuencias (absolutas o relativas) de cada combinación de valores, es posible especificar una función de agregación.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>index</strong>: Variable tipo array, serie pandas o lista de arrays/series, valores según los cuales desagregar las filas.</li> <li><strong>columns</strong>: Variable tipo array, serie pandas o lista de arrays/series, valores según los cuales desagregar las columnas.</li> <li><strong>values</strong>: Valores a los que aplicar las funciones de agregación indicadas por el parámetro <em>aggfunc</em>.</li> <li><strong>rownames</strong>: Secuencia. Nombres a dar a los niveles del índice de filas del resultado.</li> <li><strong>colnames</strong>: Secuencia. Nombres a dar a los niveles del índice de columnas del resultado.</li> <li><strong>aggfunc</strong>: Función o secuencia de funciones. Funciones de agregación a aplicar a los valores dados por el parámetro <em>values</em> para cada combinación de filas y columnas identificada.</li> <li><strong>margins</strong>: Booleano. Si toma el valor <em>True</em>, la tabla resultante incluirá subtotales.</li> <li><strong>margins_name</strong>: String. Nombre a dar a la fila o columna que contendrá los subtotales. Por defecto se aplica el nombre <em>"All"</em>.</li> <li><strong>dropna</strong>: Booleano. Si toma el valor <em>True</em>, el resultado no considerará las columnas cuyos valores sean todos NaN.</li> <li><strong>normalize</strong>: Booleano, string o número entero. En función del valor que tome este parámetro, en lugar de una tabla de frecuencias absolutas, el resultado incluirá una tabla de frecuencias relativas calculadas con respecto al total, al subtotal de filas o al subtotal de columnas. Concretamente: <ul><li>Si este parámetro toma el valor <em>"all"</em> o <em>True</em>, la normalización se realizará con respecto al número total de muestras.</li> <li>Si toma el valor <em>"index"</em> o 0, la normalización se realizará con respecto al subtotal correspondiente a cada fila.</li> <li>Si toma el valor <em>"columns"</em> o 1, la normalización se realizará con respecto al subtotal correspondiente a cada columna.</li> <li>Si toma el valor <em>False</em> (valor por defecto), el resultado de la función no se normalizará.</li> </ul></li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>La función <strong>pandas.crosstab</strong> devuelve un dataframe pandas.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Partamos del dataset <em>tips</em> proveído por la librería seaborn:</p> <div class="codigo"> <p>import pandas as pd<br /> import seaborn as sns</p> </div> <div class="codigo"> <p>tips = sns.load_dataset("tips")<br /> tips.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0031.jpg"><img alt="Dataset tips" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-46937196-df09-4756-b228-187d3c51029a" data-insert-attach="{&quot;id&quot;: &quot;46937196-df09-4756-b228-187d3c51029a&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0031.jpg" /></a></p> <p>Este dataset incluye 244 muestras:</p> <div class="codigo"> <p>tips.shape</p> </div> <div class="respuesta"> <p>(244, 7)</p> </div> <p>Podríamos averiguar el reparto de muestras resultante de cruzar los campos "<em>sex</em>" y "<em>smoker</em>" con la siguiente instrucción:</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0032.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-cbc2cc3c-5bb1-45f7-950b-be1ded6f2e11" data-insert-attach="{&quot;id&quot;: &quot;cbc2cc3c-5bb1-45f7-950b-be1ded6f2e11&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0032.jpg" /></a></p> <p>Observamos que las 244 muestras se reparten de la siguiente forma:</p> <ul><li>60 hombres fumadores</li> <li>97 hombres no fumadores</li> <li>33 mujeres fumadoras</li> <li>54 mujeres no fumadoras</li> </ul></div> <div class="field__item"><h3>crosstab &amp; groupby</h3> <p>Obsérvese que podríamos haber obtenido el mismo resultado aplicando la función <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html">pandas.DataFrame.groupby</a>. Comenzamos agrupando la tabla <em>tips</em> según los valores de los campos "<em>sex</em>" y "<em>smoker</em>" y aplicando la función <em>count</em> como función de agregación:</p> <div class="codigo"> <p>tips.groupby(["sex", "smoker"])["tip"].count()</p> </div> <div class="respuesta"> <p>sex     smoker<br /> Male    Yes       60<br />         No        97<br /> Female  Yes       33<br />         No        54<br /> Name: tip, dtype: int64</p> </div> <p>...y aplicamos el método <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.unstack.html">pandas.DataFrame.unstack</a>:</p> <div class="codigo"> <p>tips.groupby(["sex", "smoker"])["tip"].count().unstack()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0033.jpg"><img alt="Función pandas.DataFrame.groupby" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-dfddaab4-d8fe-4163-b21a-89f7e4b1cba5" data-insert-attach="{&quot;id&quot;: &quot;dfddaab4-d8fe-4163-b21a-89f7e4b1cba5&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0033.jpg" /></a></p> <h3>crosstab &amp; pivot_table</h3> <p>También podríamos haber obtenido el mismo resultado usando la función <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot_table.html">pandas.DataFrame.pivot_table</a> (funcionalidad (también disponible como método), aplicando como función de agregación la "longitud" del bloque de datos correspondiente a uno de los dos campos involucrados:</p> <div class="codigo"> <p>tips.pivot_table(index = "sex", columns = "smoker", aggfunc = {"sex": len})</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0034.jpg"><img alt="Función pandas.DataFrame.pivot_table" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-c47b4760-c749-4a16-bbc0-095ecebd05e1" data-insert-attach="{&quot;id&quot;: &quot;c47b4760-c749-4a16-bbc0-095ecebd05e1&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0034.jpg" /></a></p> </div> <div class="field__item"><p>La desagregación de filas y columnas puede realizarse según más de una variable. Por ejemplo:</p> <div class="codigo"> <p>pd.crosstab([tips.sex, tips.time], tips.smoker)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0035.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-3dfc2268-4f5e-4d26-b221-2f7a591ef382" data-insert-attach="{&quot;id&quot;: &quot;3dfc2268-4f5e-4d26-b221-2f7a591ef382&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0035.jpg" /></a></p> </div> <div class="field__item"><h3>Parámetros margins y margins_name</h3> <p>El uso del parámetro <em>margins</em> nos permite añadir subtotales de filas y columnas (no es posible mostrar subtotales solo en una única dimensión):</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker, margins = True)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0036.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-1875e644-906f-449a-aacc-ff90414d2a64" data-insert-attach="{&quot;id&quot;: &quot;1875e644-906f-449a-aacc-ff90414d2a64&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0036.jpg" /></a></p> <p>El nombre de la fila/columna con el subtotal puede configurarse usando el parámetro <em>margins_name</em>:</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker, margins = True, margins_name = "subtotal")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0037.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-09d5c89a-c18f-4731-802d-be9565c500c5" data-insert-attach="{&quot;id&quot;: &quot;09d5c89a-c18f-4731-802d-be9565c500c5&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0037.jpg" /></a></p> </div> <div class="field__item"><h3>Parámetro normalize</h3> <p>En lugar de mostrar las frecuencias absolutas de cada combinación, podemos "normalizar" dichas frecuencias con respecto al total o con respecto a los subtotales de filas o columnas. Por ejemplo, si asignamos al parámetro <em>normalize</em> el valor <em>True</em>, la normalización se realiza con respecto al total de muestras:</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker, normalize = True)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0038.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-e46862ad-0ca0-407a-8aca-5d402fe63b0e" data-insert-attach="{&quot;id&quot;: &quot;e46862ad-0ca0-407a-8aca-5d402fe63b0e&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0038.jpg" /></a></p> <p>En el resultado anterior comprobamos que, redondeando, el 24.5% de las muestras corresponden a hombres fumadores, el 39.7% a hombres no fumadores, el 13.5% a mujeres fumadoras, y el 22.1% a mujeres no fumadoras. Por supuesto, la suma de estos cuatro porcentajes es 100%.</p> <p>Si queremos que la normalización se realice según el subtotal de filas -por ejemplo-, podríamos conseguirlo con el siguiente código:</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker, normalize = "index")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0039.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-55e55631-c0f1-4b97-90af-328edbd44f3d" data-insert-attach="{&quot;id&quot;: &quot;55e55631-c0f1-4b97-90af-328edbd44f3d&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0039.jpg" /></a></p> <p>En este resultado vemos que el 100% de los hombres se divide en un 38.2% que fuma y en un 61.7% que no fuma. Y que el 100% de las mujeres se divide en un 37.9% que fuma y en un 62.0% que no lo hace.</p> </div> <div class="field__item"><h3>Parámetros rownames y colnames</h3> <p>Estos parámetros se utilizan para dar nombres a los índices. Por ejemplo, si estamos cruzando los campos "<em>sex</em>" y "<em>smoker</em>" como en los ejemplos anteriores, los índices de filas y columnas reciben esos mismos nombres:</p> <div class="codigo"> <p>pd.crosstab(tips.sex, tips.smoker)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0032.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-cbc2cc3c-5bb1-45f7-950b-be1ded6f2e11" data-insert-attach="{&quot;id&quot;: &quot;cbc2cc3c-5bb1-45f7-950b-be1ded6f2e11&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0032.jpg" /></a></p> <p>Pero podríamos cambiarlos usando los parámetros en cuestión:</p> <div class="codigo"> <p>pd.crosstab(<br />     tips.sex,<br />     tips.smoker,<br />     rownames = ["Sexo"],<br />     colnames = ["Fumador"]<br /> )</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0040.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-1e253395-4d51-4160-8fb7-420eb0feedbe" data-insert-attach="{&quot;id&quot;: &quot;1e253395-4d51-4160-8fb7-420eb0feedbe&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0040.jpg" /></a></p> <p>Si estuviésemos cruzando más de dos campos (incluyendo el resultado un índice multinivel), el número de nombre deberá coincidir con el número de niveles de cada índice. Por ejemplo:</p> <div class="codigo"> <p>pd.crosstab(<br />     [tips.sex, tips.time],<br />     tips.smoker,<br />     rownames = ["Sexo", "Tipo"],<br />     colnames = ["Fumador"]<br /> )</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0041.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-85ab9552-d60c-4cc5-aadb-c0586fc94d58" data-insert-attach="{&quot;id&quot;: &quot;85ab9552-d60c-4cc5-aadb-c0586fc94d58&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0041.jpg" /></a></p> </div> <div class="field__item"><h3>Parámetros aggfunc y values</h3> <p>Todos los ejemplos vistos hasta ahora desagregaban los campos que se llevaban a filas y columnas y se contabilizaba su frecuencia (absoluta o relativa). Pongamos un ejemplo muy simple: llevemos a la variable <em>t</em> un conjunto de 8 muestras aleatorias extraídas del dataset <em>tips</em>:</p> <div class="codigo"> <p>t = tips.sample(8, random_state = 0)<br /> t</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0042.jpg"><img alt="Subconjunto de 8 muestras del dataset tips" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-9a1a178a-26ca-4a7f-a742-6ad7e3863596" data-insert-attach="{&quot;id&quot;: &quot;9a1a178a-26ca-4a7f-a742-6ad7e3863596&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0042.jpg" /></a></p> <p>Obtengamos ahora la tabla de contingencia cruzando los campos <em>sex</em> y <em>smoker</em>:</p> <div class="codigo"> <p>pd.crosstab(t.sex, t.smoker)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0043.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-b04902de-4c6c-4d8d-b6c1-dff839ffa6b3" data-insert-attach="{&quot;id&quot;: &quot;b04902de-4c6c-4d8d-b6c1-dff839ffa6b3&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0043.jpg" /></a></p> <p>Ya sabemos que lo que estamos haciendo es agrupar las muestras según el criterio definido por la combinación de los valores de los dos campos. Por ejemplo, en el resultado anterior vemos que hay tres hombre fumadores, dos hombres no fumadores, dos mujeres fumadoras y una mujer no fumadora.</p> <p>Sin embargo, una vez desagregados nuestros datos en estos cuatro bloques, podríamos estar interesados en aplicar una o más funciones de agregación a campos adicionales del dataset. Por ejemplo, podríamos querer calcular el valor medio de las propinas (campo <em>tip</em>) para estos bloques de clientes.</p> <p>Pues bien, esto es exactamente lo que nos permiten los parámetros <em>aggfunc</em> y <em>values</em>: el primero nos permite indicar la función o funciones de agregación a aplicar y, el segundo, los datos a los que aplicarlos. El valor medio de las propinas mencionado podría obtenerse con el siguiente código:</p> <div class="codigo"> <p>pd.crosstab(t.sex, t.smoker, aggfunc = "mean", values = t.tip)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0044.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-6a1dd275-749b-47f2-887d-bcb62f95bac4" data-insert-attach="{&quot;id&quot;: &quot;6a1dd275-749b-47f2-887d-bcb62f95bac4&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0044.jpg" /></a></p> <p>Confirmemos que el cálculo es correcto: vimos que hay tres hombres fumadores. Si revisamos el dataset t vemos que las propinas dejadas por estos clientes toman los valores 3.76, 3.08 y 5.65:</p> <div class="codigo"> <p>t.loc[(t.sex == "Male") &amp; (t.smoker == "Yes")]</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0045.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-3bdfbaf0-4903-4644-99ea-550cea3c0084" data-insert-attach="{&quot;id&quot;: &quot;3bdfbaf0-4903-4644-99ea-550cea3c0084&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0045.jpg" /></a></p> <p>El valor medio de estos tres valores es 4.1633, que es el valor que aparece como resultado de nuestra tabla de contingencia.</p> <p>Podemos aplicar más de una función de agregación. Por ejemplo, podríamos estar interesados en el valor medio y en el valor máximo de las propinas para cada uno de esos cuatro grupos de clientes:</p> <div class="codigo"> <p>pd.crosstab(t.sex, t.smoker, aggfunc = ["mean", "max"], values = t.tip)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0046.jpg"><img alt="Función pandas.crosstab" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-bb5ae1b2-6762-4bb8-a05b-2257be5ef701" data-insert-attach="{&quot;id&quot;: &quot;bb5ae1b2-6762-4bb8-a05b-2257be5ef701&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0046.jpg" /></a></p> </div> </div> </div> Fri, 13 Nov 2020 09:17:32 +0000 admin 2863 at https://interactivechaos.ovh pandas.DataFrame.drop https://interactivechaos.ovh/es/python/function/pandasdataframedrop <span class="field field--name-title field--type-string field--label-hidden">pandas.DataFrame.drop</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sáb, 07/11/2020 - 13:46</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.DataFrame.drop</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>DataFrame.drop(<br />     labels = None,<br />     axis = 0,<br />     index = None,<br />     columns = None,<br />     level = None,<br />     inplace = False,<br />     errors = 'raise'<br /> )</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>El método <strong>.drop()</strong> asociado a un dataframe pandas devuelve una copia del mismo tras eliminar las filas o columnas indicadas. Éstas deberán referenciarse por sus etiquetas explícitas, no por su posición en el eje.</p> <p>La eliminación se realiza, por defecto, en el eje vertical (se eliminan filas, por lo tanto).</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>labels</strong>: Etiqueta o lista de etiquetas a eliminar.</li> <li><strong>axis</strong>: Eje en el que realizar la eliminación. Puede indicarse el valor 0 o "<em>index</em>" para hacer referencia al eje 0 (y eliminar filas), o el valor 1 o "<em>columns</em>" para hacer referencia al eje 1 (y eliminar columnas). El valor por defecto es 0.</li> <li><strong>index</strong>: Etiqueta o lista de etiquetas a eliminar del eje 0.</li> <li><strong>columns</strong>: Etiqueta o lista de etiquetas a eliminar del eje 1.</li> <li><strong>level</strong>: Número entero o nombre del nivel a eliminar de un índice multinivel.</li> <li><strong>inplace</strong>: Booleano. Si toma el valor <em>True</em>, la eliminación se realiza en el mismo dataframe. Si toma el valor <em>False</em>, el método devuelve una copia del dataframe tras eliminar las filas o columnas especificadas.</li> <li><strong>errors</strong>: Este parámetro puede tomar los valores "<em>ignore</em>" o "<em>raise</em>" y se considera cuando alguna de las etiquetas referenciadas no existe. El valor por defecto es "raise" lo que provoca que la función devuelva un error cuando alguna etiqueta no exista. Si se fija el valor de este parámetro a <em>"ignore"</em>, los errores son ignorados.</li> </ul><p>Los parámetros <em>index</em> y <em>columns</em> son alternativas al parámetro <em>axis</em>. Solo puede indicarse un parámetro de entre <em>axis</em>, <em>index</em> y <em>columns</em>.</p></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>El resultado es un dataframe pandas con independencia del número de filas o columnas que se eliminen.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Partimos del dataframe <em>tips</em> proveído por seaborn:</p> <div class="codigo"> <p>tips.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0021.jpg"><img alt="Dataset tips" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-627080b0-1c83-4373-9fb0-023ce2c03473" data-insert-attach="{&quot;id&quot;: &quot;627080b0-1c83-4373-9fb0-023ce2c03473&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0021.jpg" /></a></p> <p>Por defecto se eliminan filas y se devuelve una copia del dataframe tras realizar la eliminación:</p> <div class="codigo"> <p>tips.drop(2).head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0022.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-d13ea866-4d06-468b-aebd-fe9565048254" data-insert-attach="{&quot;id&quot;: &quot;d13ea866-4d06-468b-aebd-fe9565048254&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0022.jpg" /></a></p> <p>Obtenemos el mismo resultado si especificamos el parámetro "<em>index</em>":</p> <div class="codigo"> <p>tips.drop(index = 2).head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0023.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-abd9664c-9e4b-4710-af7d-0ade39cc9bef" data-insert-attach="{&quot;id&quot;: &quot;abd9664c-9e4b-4710-af7d-0ade39cc9bef&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0023.jpg" /></a></p> </div> <div class="field__item"><p>Es posible eliminar simultáneamente más de una fila o columna pasando como argumento no una etiqueta sino una lista de ellas:</p> <div class="codigo"> <p>tips.drop(columns = ["tip", "smoker"]).head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0024.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-fdf544b8-a0be-4ef2-bc95-d6f23340b1ae" data-insert-attach="{&quot;id&quot;: &quot;fdf544b8-a0be-4ef2-bc95-d6f23340b1ae&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0024.jpg" /></a></p> </div> <div class="field__item"><p>Si alguna de las etiquetas indicadas no existe, el método devuelve un error:</p> <div class="codigo"> <p>try:<br />     tips.drop(columns = ["tip", "smoker", "weather"]).head()<br /> except:<br />     print("Error")</p> </div> <div class="respuesta"> <p>Error</p> </div> <p>Sin embargo, podemos forzar que la función ignore estas etiquetas inexistentes asignando al parámetro <em>errors</em> el valor <em>"ignore"</em>:</p> <div class="codigo"> <p>tips.drop(columns = ["tip", "smoker", "weather"], errors = "ignore").head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0025.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-31f1ecae-8e7f-4338-857d-37753b6d8c21" data-insert-attach="{&quot;id&quot;: &quot;31f1ecae-8e7f-4338-857d-37753b6d8c21&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0025.jpg" /></a></p> </div> <div class="field__item"><p>El resultado es un dataframe aun cuando se eliminen todas las filas o todas las columnas:</p> <div class="codigo"> <p>df = tips.drop(tips.columns, axis = 1)<br /> df</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0026.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-6b7d6d0e-63a2-47d8-946d-d5f91df26824" data-insert-attach="{&quot;id&quot;: &quot;6b7d6d0e-63a2-47d8-946d-d5f91df26824&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0026.jpg" /></a></p> <div class="codigo"> <p>type(df)</p> </div> <div class="respuesta"> <p>pandas.core.frame.DataFrame</p> </div> </div> <div class="field__item"><h3>Multi-índices</h3> <p>Para probar el comportamiento de esta función con multi-índices partimos del siguiente dataframe:</p> <div class="codigo"> <p>data = tips.pivot_table(index = ["sex", "time"])<br /> data</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0027.jpg"><img alt="Método pandas.DataFrame.drop" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-0d63b62f-98ff-4685-bf8a-874b44ac4d85" data-insert-attach="{&quot;id&quot;: &quot;0d63b62f-98ff-4685-bf8a-874b44ac4d85&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0027.jpg" /></a></p> <p>Si deseamos eliminar, por ejemplo, la etiqueta "<em>Male</em>" del índice (etiqueta que se encuentra en el nivel 0 del multi-índice), podemos conseguirlo con el siguiente código:</p> <div class="codigo"> <p>data.drop(index = ["Male"], level = 0)</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0028.jpg"><img alt="Método pandas.DataFrame.drop con multi-índices" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-baf7ecf8-da7c-4fee-be83-354d14f24da9" data-insert-attach="{&quot;id&quot;: &quot;baf7ecf8-da7c-4fee-be83-354d14f24da9&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0028.jpg" /></a></p> <p>Podemos obtener el mismo resultado haciendo referencia no al nivel, sino a su nombre:</p> <div class="codigo"> <p>data.drop(index = ["Male"], level = "sex")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0029.jpg"><img alt="Método pandas.DataFrame.drop con multi-índices" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-5635947c-f25c-4d57-9531-8697c6d38ed0" data-insert-attach="{&quot;id&quot;: &quot;5635947c-f25c-4d57-9531-8697c6d38ed0&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0029.jpg" /></a></p> </div> <div class="field__item"><p>La función permite eliminar etiquetas de niveles "superiores". Por ejemplo:</p> <div class="codigo"> <p>data.drop(index = ["Lunch"], level = "time")</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0030.jpg"><img alt="Método pandas.DataFrame.drop con multi-índices" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-6bdbb12a-9a96-45a5-81f2-7243cf68c34a" data-insert-attach="{&quot;id&quot;: &quot;6bdbb12a-9a96-45a5-81f2-7243cf68c34a&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0030.jpg" /></a></p> </div> </div> </div> Sat, 07 Nov 2020 12:46:49 +0000 admin 2859 at https://interactivechaos.ovh pandas.DataFrame.select_dtypes https://interactivechaos.ovh/es/python/function/pandasdataframeselectdtypes <span class="field field--name-title field--type-string field--label-hidden">pandas.DataFrame.select_dtypes</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 06/11/2020 - 13:36</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.DataFrame.select_dtypes</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>DataFrame.select_dtypes(<br />     include = None,<br />     exclude = None<br /> )</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>El método de un dataframe <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.select_dtypes.html">select_dtypes</a> devuelve el subconjunto del dataframe formado por las columnas de los tipos especificados, pudiendo especificarse los tipos que se quieren seleccionar y/o aquellos que se quieren excluir.</p> <p>Los tipos pueden referenciarse por su nombre (<em>np.number</em>, por ejemplo) o por una cadena de texto (<em>"category"</em>, por ejemplo).</p> <ul><li>Si queremos seleccionar todos los tipos numéricos deberemos usar <em>np.number</em> o <em>"number".</em></li> <li>El tipo <em>object</em> devuelve todas las columnas de tipo objeto, incluyendo los textos.</li> <li>Para seleccionar fechas podemos usar <em>np.datetime64</em>, <em>"datetime"</em> o <em>"datetime64".</em></li> <li>Para seleccionar <em>timedeltas</em> podemos usar <em>np.timedelta64</em>, <em>"timedelta"</em> o <em>"timedelta64".</em></li> <li>Si queremos seleccionar los tipos categóricos de pandas deberemos usar <em>"category".</em></li> <li>Para seleccionar los tipos <em>datetimezn</em> de pandas podemos usar <em>"datetimetz"</em> o <em>"datetime64[ns, tz]".</em></li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>include</strong>: Tipo o lista de tipos que se quieren incluir en la selección.</li> <li><strong>exclude</strong>: Tipo o lista de tipos que se quieren excluir de la selección.</li> </ul><p> </p> <ul></ul></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>El método <em>select_dtypes</em> devuelve una vista del dataframe original con formato DateTime (con independencia del número de columnas devueltas).</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Si partimos del dataset <em>tips</em> proveído por seaborn:</p> <div class="codigo"> <p>tips = sns.load_dataset("tips")<br /> tips.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0017B.jpg"><img alt="Dataset tips de seaborn" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-bebcd86f-4dd6-45c1-9a1c-8b065f7368b5" data-insert-attach="{&quot;id&quot;: &quot;bebcd86f-4dd6-45c1-9a1c-8b065f7368b5&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0017B.jpg" /></a></p> <p>...podríamos seleccionar solo los campos numéricos (con independencia de su tipo exacto) con el siguiente código:</p> <div class="codigo"> <p>tips_number = tips.select_dtypes(np.number)<br /> tips_number.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0018.jpg"><img alt="Columnas de tipo numérico" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-709fa3b1-b379-46e5-82ba-addd3161f0e3" data-insert-attach="{&quot;id&quot;: &quot;709fa3b1-b379-46e5-82ba-addd3161f0e3&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0018.jpg" /></a></p> </div> <div class="field__item"><p>En el caso de proporcionar tanto el parámetro <em>include</em> como el <em>exclude</em>, se seleccionarán los campos que cumplan ambos criterios. Por ejemplo, el dataset <em>tips</em> incluye datos numéricos de tipos <em>float</em> e <em>int</em>:</p> <div class="codigo"> <p>tips.dtypes</p> </div> <div class="respuesta"> <p>total_bill     float64<br /> tip            float64<br /> sex           category<br /> smoker        category<br /> day           category<br /> time          category<br /> size             int64<br /> dtype: object</p> </div> <p>Si incluimos los tipos numéricos y excluimos el tipo <em>float</em>, el resultado incluye solo la columna "<em>size</em>":</p> <div class="codigo"> <p>tips_number = tips.select_dtypes(include = np.number, exclude = float)<br /> tips_number.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0019.jpg"><img alt="Función df.select_dtypes" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-a0cfb451-10d4-4d6d-9dce-bab1db5cc4e3" data-insert-attach="{&quot;id&quot;: &quot;a0cfb451-10d4-4d6d-9dce-bab1db5cc4e3&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0019.jpg" /></a></p> <p>Si, por el contrario, incluimos solo el tipo <em>float</em> pero excluimos los tipos numéricos, el resultado es un dataframe vacío:</p> <div class="codigo"> <p>tips_number = tips.select_dtypes(include = float, exclude = np.number)<br /> tips_number.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-11/python_0020.jpg"><img alt="Función df.select_dtypes" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-4e91f4fd-76bc-4a4e-b058-81a0a4fdb221" data-insert-attach="{&quot;id&quot;: &quot;4e91f4fd-76bc-4a4e-b058-81a0a4fdb221&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-11/python_0020.jpg" /></a></p> </div> </div> </div> Fri, 06 Nov 2020 12:36:22 +0000 admin 2858 at https://interactivechaos.ovh pandas.Series.str https://interactivechaos.ovh/es/python/function/pandasseriesstr <span class="field field--name-title field--type-string field--label-hidden">pandas.Series.str</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 05/11/2020 - 17:50</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">pandas.Series.str</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">pandas</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>pandas.Series.str()</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>El método <strong>str</strong> de una serie pandas nos da acceso a funciones vectorizadas de tratamiento de cadenas de texto, haciendo innecesario el recurrir a bucles externos.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><p>El método pandas.Series.str no acepta parámetros.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Supongamos que partimos de la siguiente serie pandas:</p> <div class="codigo"> <p>s = pd.Series(["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio"])<br /> s</p> </div> <div class="respuesta"> <p>0      Enero<br /> 1    Febrero<br /> 2      Marzo<br /> 3      Abril<br /> 4       Mayo<br /> 5      Junio<br /> dtype: object</p> </div> <p>Si deseásemos, por ejemplo, convertir los nombres de los meses a mayúsculas, podríamos pensar que el único método es recurrir a bucles externos o a una list comprehension:</p> <div class="codigo"> <p>[t.upper() for t in s]</p> </div> <div class="respuesta"> <p>['ENERO', 'FEBRERO', 'MARZO', 'ABRIL', 'MAYO', 'JUNIO']</p> </div> <p>...para reasignar estos valores a nuestra serie s:</p> <div class="codigo"> <p>s = pd.Series([t.upper() for t in s])<br /> s</p> </div> <div class="respuesta"> <p>0      ENERO<br /> 1    FEBRERO<br /> 2      MARZO<br /> 3      ABRIL<br /> 4       MAYO<br /> 5      JUNIO<br /> dtype: object</p> </div> <p>Sin embargo, el rendimiento de este tipo de herramientas es inferior al que nos ofrecen las funciones vectorizadas, por lo que sería conveniente disponer de este tipo de funciones para poder aplicarlas a los valores de las estructuras pandas uno por uno ("<em>element-wise</em>"). Pues bien, el método <em>str</em> precisamente nos da acceso a este tipo de funciones. Por ejemplo, si partimos de nuestra serie s original:</p> <div class="codigo"> <p>s = pd.Series(["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio"])<br /> s</p> </div> <div class="respuesta"> <p>0      Enero<br /> 1    Febrero<br /> 2      Marzo<br /> 3      Abril<br /> 4       Mayo<br /> 5      Junio<br /> dtype: object</p> </div> <p>...para convertir los textos a mayúsculas valdría con ejecutar el siguiente código:</p> <div class="codigo"> <p>s = s.str.upper()<br /> s</p> </div> <div class="respuesta"> <p>0      ENERO<br /> 1    FEBRERO<br /> 2      MARZO<br /> 3      ABRIL<br /> 4       MAYO<br /> 5      JUNIO<br /> dtype: object</p> </div> <p>Podemos visualizar el conjunto de nombres asociados a este método para confirmar las funciones a las que tenemos acceso:</p> <div class="codigo"> <p>print([i for i in dir(pd.Series.str) if not i.startswith("_")])</p> </div> <div class="respuesta"> <p>['capitalize', 'casefold', 'cat', 'center', 'contains', 'count', 'decode', 'encode', 'endswith', 'extract', 'extractall', 'find', 'findall', 'get', 'get_dummies', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'islower', 'isnumeric', 'isspace', 'istitle', 'isupper', 'join', 'len', 'ljust', 'lower', 'lstrip', 'match', 'normalize', 'pad', 'partition', 'repeat', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'slice', 'slice_replace', 'split', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'wrap', 'zfill']</p> </div> </div> </div> </div> Thu, 05 Nov 2020 16:50:04 +0000 admin 2857 at https://interactivechaos.ovh Extracción de una columna de un DataFrame como Serie independiente https://interactivechaos.ovh/es/python/scenario/extraccion-de-una-columna-de-un-dataframe-como-serie-independiente <span class="field field--name-title field--type-string field--label-hidden">Extracción de una columna de un DataFrame como Serie independiente</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mié, 24/06/2020 - 11:22</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En este sencillo escenario partimos de un DataFrame que incluye tanto las características predictivas como la etiqueta. Por ejemplo... el dataset "<em>iris</em>":</p> <div class="codigo"> <p>import seaborn as sns</p> </div> <div class="codigo"> <p>iris = sns.load_dataset("iris")<br /> iris.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0014.jpg"><img alt="Dataset Iris" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-b8802064-2927-438a-979b-b869d77b8c35" data-insert-attach="{&quot;id&quot;: &quot;b8802064-2927-438a-979b-b869d77b8c35&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0014.jpg" /></a></p> <p>Si quisiéramos extraer la columna "<em>species</em>" (etiqueta) como Serie Pandas independiente, basta con usar el método .pop() del DataFrame:</p> <div class="codigo"> <p>y = iris.pop("species")</p> </div> <p>Ahora la variable <em>y</em> contiene solo el campo en cuestión:</p> <div class="codigo"> <p>y.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0015.jpg"><img alt="Serie Pandas con el campo &amp;quot;species&amp;quot;" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-38dd07c4-d731-49bf-bd52-e3bce2d811f0" data-insert-attach="{&quot;id&quot;: &quot;38dd07c4-d731-49bf-bd52-e3bce2d811f0&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0015.jpg" /></a></p> <p>...y el DataFrame iris ahora ya no incluye el campo extraído:</p> <div class="codigo"> <p>iris.head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0016.jpg"><img alt="DataFrame Iris tras extraer la columna &amp;quot;species&amp;quot;" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-405a43f5-5aab-4571-b1f6-5cd1e9e86b1b" data-insert-attach="{&quot;id&quot;: &quot;405a43f5-5aab-4571-b1f6-5cd1e9e86b1b&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0016.jpg" /></a></p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/pandas" hreflang="es">pandas</a></div> </div> </div> Wed, 24 Jun 2020 09:22:54 +0000 admin 2163 at https://interactivechaos.ovh Copiado rápido de datos de Excel o Google Sheets a un DataFrame Pandas https://interactivechaos.ovh/es/python/scenario/copiado-rapido-de-datos-de-excel-o-google-sheets-un-dataframe-pandas <span class="field field--name-title field--type-string field--label-hidden">Copiado rápido de datos de Excel o Google Sheets a un DataFrame Pandas</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mié, 24/06/2020 - 08:58</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Si tenemos datos contenidos en un libro Excel o en Google Sheets y queremos copiarlos a nuestro notebook en forma de DataFrame Pandas podemos, por supuesto, volcar dicho fichero a disco (en formato Excel o CSV) y leerlo usando funciones de esta librería. Pero hay otro método más rápido. Supongamos que tenemos el siguiente dataset en un libro Excel:</p> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0012.jpg"><img alt="Dataset en libro Excel" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-9388c531-a750-44ec-9157-bc46a258036c" data-insert-attach="{&quot;id&quot;: &quot;9388c531-a750-44ec-9157-bc46a258036c&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0012.jpg" /></a> <p>Deberemos seleccionar las celdas en cuestión y copiarlas al clipboard (con <em>Control-C</em> en Windows). A continuación ejecutamos la función <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_clipboard.html">pd.read_clipboard()</a> de pandas:</p> <div class="codigo"> <p>import pandas as pd</p> </div> <div class="codigo"> <p>data = pd.read_clipboard()</p> </div> <p>En este momento, la variable <em>data</em> contiene ya el DataFrame resultante de la lectura del clipboard, cosa que podemos comprobar volcando la variable en pantalla:</p> <div class="codigo"> <p>data</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0013.jpg"><img alt="DataFrame Pandas leído desde el clipboard" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-96b92f08-9425-4c9e-b18a-527705606d5a" data-insert-attach="{&quot;id&quot;: &quot;96b92f08-9425-4c9e-b18a-527705606d5a&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0013.jpg" /></a></p> Ahora resultará conveniente volcar el DataFrame a disco para poder usarlo en futuras ocasiones...</div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/pandas" hreflang="es">pandas</a></div> </div> </div> Wed, 24 Jun 2020 06:58:33 +0000 admin 2162 at https://interactivechaos.ovh Codificación rápida de una columna categoría de un DataFrame https://interactivechaos.ovh/es/python/scenario/codificacion-rapida-de-una-columna-categoria-de-un-dataframe <span class="field field--name-title field--type-string field--label-hidden">Codificación rápida de una columna categoría de un DataFrame</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mar, 23/06/2020 - 19:40</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Librerías como Scikit-Learn o Pandas (por mencionar apenas un par de ellas) nos ofrece diferentes codificadores de características predictivas categóricas (<a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html">LabelEncoder</a>, <a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html">OneHotEncoder</a>, <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html">get_dummies</a>, etc.), herramientas que nos devuelven los valores codificados, las etiquetas originales, el diccionario usado para la codificación, etc. Pero a veces nos encontraremos con la situación de querer codificar una característica predictiva a valores entre 0 y el número de clases -1, y no estamos interesados en ninguna otra funcionalidad. Por ejemplo, carguemos el dataset "<em>tips</em>" proveído por seaborn:</p> <div class="codigo"> <p>import seaborn as sns</p> </div> <div class="codigo"> <p>data = sns.load_dataset("tips")<br /> data.tail()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0009.jpg"><img alt="Dataset &amp;quot;tips&amp;quot;" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-d4e72504-4ec2-40d1-822f-55203976289c" data-insert-attach="{&quot;id&quot;: &quot;d4e72504-4ec2-40d1-822f-55203976289c&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0009.jpg" /></a></p> <p>...y supongamos que queremos codificar la característica <em>smoker</em> a los valores 0 y 1 (y que no nos importa la asignación exacta que se realice). Este tipo de codificación "rápida y sucia" puede obtenerse con el siguiente código:</p> <div class="codigo"> <p>data.smoker.astype("category").cat.codes</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0010.jpg"><img alt="Columna &amp;quot;smoker&amp;quot; codificada" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-65c6a784-599b-49cb-9476-10836e66b75c" data-insert-attach="{&quot;id&quot;: &quot;65c6a784-599b-49cb-9476-10836e66b75c&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0010.jpg" /></a></p> <p>Comprobamos que, tras convertir el campo a tipo categórico y extraer los códigos, obtenemos un 1 para cada valor "No" de la característica predictiva y un 0 para los valores "Yes".</p> <p>Si deseásemos sustituir la característica original por la versión codificada, bastaría con ejecutar el siguiente código:</p> <div class="codigo"> <p>data.smoker = data.smoker.astype("category").cat.codes<br /> data.tail()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0011.jpg"><img alt="Dataset &amp;quot;tips&amp;quot; con la columna &amp;quot;smoker&amp;quot; codificada" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-231ae964-72d5-47be-ab19-5580b3b8a729" data-insert-attach="{&quot;id&quot;: &quot;231ae964-72d5-47be-ab19-5580b3b8a729&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0011.jpg" /></a></p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/pandas" hreflang="es">pandas</a></div> </div> </div> Tue, 23 Jun 2020 17:40:26 +0000 admin 2159 at https://interactivechaos.ovh Configuración del número de columnas mostradas en un DataFrame https://interactivechaos.ovh/es/python/scenario/configuracion-del-numero-de-columnas-mostradas-en-un-dataframe <span class="field field--name-title field--type-string field--label-hidden">Configuración del número de columnas mostradas en un DataFrame</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mar, 23/06/2020 - 19:11</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Con cierta frecuencia tenemos que trabajar con DataFrames pandas que, al ser mostrados en un cuaderno Jupyter, muestran solo parte de las columnas que incluyen. Por ejemplo, carguemos el dataset <em>Breast Cancer</em> de Scikit Learn:</p> <div class="codigo"> <p>from sklearn.datasets import load_breast_cancer<br /> import pandas as pd</p> </div> <div class="codigo"> <p>data = load_breast_cancer()<br /> df = pd.DataFrame(data.data, columns = data.feature_names)</p> </div> <div class="codigo"> <p>df</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0007.jpg"><img alt="Dataset Breast Cancer" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-d39359c9-a927-4040-9e3a-484a384d806f" data-insert-attach="{&quot;id&quot;: &quot;d39359c9-a927-4040-9e3a-484a384d806f&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0007.jpg" /></a></p> <p>En la captura de pantalla anterior podemos ver que se muestra una barra de desplazamiento horizontal en la parte inferior pues el número de columnas es relativamente elevado, pero no es posible visualizar todas ellas, cosa que queda patente por la presencia de los puntos suspensivos que se muestran en cierta columna del DataFrame.</p> <p>Y la pregunta que podemos hacernos es, ya que podemos usar una barra de desplazamiento ¿por qué no poder visualizar todas las columnas? Pues bien, el número máximo de columnas a mostrar puede configurarse fijando el valor de la variable <a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html">pd.options.display.max_columns</a>. Por ejemplo, el dataset anterior tiene 30 columnas:</p> <div class="codigo"> <p>len(df.columns)</p> </div> <div class="respuesta"> <p>30</p> </div> <p>Si fijamos el número máximo de columnas a una cifra igual o superior o este número:</p> <div class="codigo"> <p>pd.options.display.max_columns = 50</p> </div> <p>...ahora, al mostrar el DataFrame, no se mostrará la columna de puntos suspensivos hasta que no se supere dicha cifra, permitiéndonos visualizar todas las columnas:</p> <div class="codigo"> <p>df</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2020-06/python_0007.jpg"><img alt="Dataset Breast Cancer" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-d39359c9-a927-4040-9e3a-484a384d806f" data-insert-attach="{&quot;id&quot;: &quot;d39359c9-a927-4040-9e3a-484a384d806f&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2020-06/python_0007.jpg" /></a> <p>Si fijamos como número máximo el valor <em>None</em>, se mostrarán siempre todas las columnas del DataFrame.</p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/pandas" hreflang="es">pandas</a></div> </div> </div> Tue, 23 Jun 2020 17:11:24 +0000 admin 2158 at https://interactivechaos.ovh