<div dir="ltr"><div>Buenísimo Ricardo, gracias ya lo anoto.</div><div>Si lo de numpy y el array algo de eso vi muy por arriba, por ahora quiero familiarizarme con algunas cosas de momento.</div><div>Gracias, saludos<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El mié., 5 ago. 2020 a las 17:23, Ricardo Cárdenes (<<a href="mailto:ricardo.cardenes@gmail.com">ricardo.cardenes@gmail.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Por cierto, añado: observa que limité los criterios a columnas concretas. Eso tiene perfecto sentido aquí porque cada columna tiene una semántica diferente. Sin embargo, nada te impide aplicar <font face="monospace">isin</font> a un <font face="monospace">DataFrame</font> entero. El problema es que el resultado puede no tener mucho sentido (o sí, depende):<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:medium none;padding:0px"><div><font face="monospace">>>> mask = df2.isin(['382.24', '617.12'])</font></div><div><font face="monospace">>>> mask</font></div><div><font face="monospace">         lab   pami</font></div><div><font face="monospace">19     False  False</font></div><div><font face="monospace">629    False   True</font></div><div><font face="monospace">23549  False  False</font></div><div><font face="monospace">30087  False   True</font></div></blockquote><div><br></div><div>Obviamente, todas las entradas de la columna "lab" salen falsos. ¿Qué sucede si usas esto como máscara?</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:medium none;padding:0px"><div><font face="monospace">>>> df2[mask]</font></div><div><font face="monospace">       lab    pami</font></div><div><font face="monospace">19     NaN     NaN</font></div><div><font face="monospace">629    NaN  382.24</font></div><div><font face="monospace">23549  NaN     NaN</font></div><div><font face="monospace">30087  NaN  617.12</font></div></blockquote><div><br></div><div>Dado que no puedes discriminar filas enteras, la máscara no sabe lo que estás queriendo hacer. Y por tanto va a mostrarte <b>todo</b>, pero poniendo valores <font face="monospace">NaN</font> ("not a number") en las celdas falsas.</div><div><br></div><div>Por cierto, que la máscara no tiene por qué ser un <font face="monospace">DataSet</font>. Puede ser por ejemplo una simple lista, que se aplica al primer eje (filas, en este caso):</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:medium none;padding:0px"><div><font face="monospace">>>> df2[[False, True, False, True]]</font></div><div><font face="monospace">         lab    pami</font></div><div><font face="monospace">629    Alcon  382.24</font></div><div><font face="monospace">30087  Fabra  617.12</font></div></blockquote><div><br></div><div>Y dado que Pandas se apoya en NumPy, imagino que puedes pasar un array de NumPy también.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Aug 5, 2020 at 10:12 AM Ricardo Cárdenes <<a href="mailto:ricardo.cardenes@gmail.com" target="_blank">ricardo.cardenes@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Aparte de lo que te está contestando Darío (error en la entrada: 627.12 en lugar de 617.12), a tu otra pregunta...<div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="color:rgb(255,0,0)">- Acá paso también 2 valores: 1 y 3, no entiendo porque me muestra valores booleanos, en realidad no se que estaría chequeando</span></blockquote><div><br></div></div><div><font face="monospace">isin</font> te devuelve <b>siempre</b> un <font face="monospace">DataFrame</font> de booleanos, siendo <font face="monospace">True</font> las celdas donde hay coincidencia con alguno de los valores que pasaste a <font face="monospace">isin</font><font face="arial, sans-serif">. Así pues, ninguna sorpresa. Ese dataframe de booleanos lo puedes utilizar como una <i>máscara</i> para filtrar los valores de otro </font><font face="monospace">DataFrame</font><font face="arial, sans-serif">. Eso es lo que haces en tu ejemplo anterior:</font></div><div><font face="arial, sans-serif"><br></font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><b>print(df2[df2['pami'].isin(['382.24', '627.12'])])</b></blockquote><div><br></div><div> Observa que estás usando <font face="monospace">df2['pami'].isin(['382.24', '627.12'])</font> como índice del propio <font face="monospace">df2</font>. En este caso, tu máscara está discriminando algunas filas: el resultado de <font face="monospace">df2[mascara]</font> será un nuevo DataFrame que mostrará (normalmente esto se hace con una clase proxy que actúa como "vista") sólo esas filas.</div><div><br></div><div>En tu segundo ejemplo no estás aplicando la máscara: la estás imprimiendo directamente y por tanto sólo ves los booleanos.</div><div><br></div><div>Curiosidad: las máscaras se pueden combinar usando operaciones booleanas normales. Por ejemplo, combinando criterios sobre diferentes columnas:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:medium none;padding:0px"><div><font face="monospace">>>> l = df2['lab'].isin(['Alcon'])</font></div><div><font face="monospace">>>> p = df2['pami'].isin(['382.24', '617.12'])</font></div><div><font face="monospace">>>> l</font></div><div><font face="monospace">19       False</font></div><div><font face="monospace">629      False</font></div><div><font face="monospace">23549     True</font></div><div><font face="monospace">30087    False</font></div><div><font face="monospace">Name: lab, dtype: bool</font></div><div><font face="monospace">>>> p</font></div><div><font face="monospace">19       False</font></div><div><font face="monospace">629       True</font></div><div><font face="monospace">23549    False</font></div><div><font face="monospace">30087     True</font></div><div><font face="monospace">Name: pami, dtype: bool</font></div><div><font face="monospace">>>> l & p    # AND lógico -> todas False porque no coincide nada</font></div><div><font face="monospace">19       False</font></div><div><font face="monospace">629      False</font></div><div><font face="monospace">23549    False</font></div><div><font face="monospace">30087    False</font></div><div><font face="monospace">dtype: bool</font></div><div><font face="monospace">>>> l | p    # OR lógico -> combina las filas True de ambas</font></div><div><font face="monospace">19       False</font></div><div><font face="monospace">629       True</font></div><div><font face="monospace">23549     True</font></div><div><font face="monospace">30087     True</font></div><div><font face="monospace">dtype: bool</font></div><div><font face="monospace">>>> df2[l | p]    # DataFrame con las filas que cumplen AL MENOS uno de los dos criterios</font></div><div><font face="monospace">          lab    pami</font></div><div><font face="monospace">629     Alcon  382.24</font></div><div><font face="monospace">23549  Duncan  245.44</font></div><div><font face="monospace">30087   Fabra  617.12</font></div><div><font face="monospace">>>> df2[l & p]    # DataFrame con las filas que cumplen AMBOS criterios (está vacío, claro)</font></div><div><font face="monospace">Empty DataFrame</font></div><div><font face="monospace">Columns: [lab, pami]</font></div><div><font face="monospace">Index: []</font></div></blockquote><div><br></div><div>Saludos,</div><div>Ricardo</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Aug 5, 2020 at 9:06 AM Lemarchand Barker <<a href="mailto:lemarchand8679@gmail.com" target="_blank">lemarchand8679@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hola siguiendo con la lectura de pandas, estoy probando isin() y no me queda muy en claro bien que función cumple y qué tipo de uso le podría dar.<br>Mi ejemplo es el siguiente:<br><br>leer = pd.read_csv('democsv.csv')<br>df = pd.DataFrame({<br>    'lab': ['Abbott Diabetes', 'Alcon', 'Duncan', 'Fabra'],<br>    'pami': ['490.13', '382.24', '245.44', '617.12'],},<br>    index=['19', '629', '23549', '30087'])<br>df2 = df.copy()<br><br>df2['pami'] = ['490.13', '382.24', '245.44', '617.12']<br><b>print(df2['pami'])</b><br><br>Salida:<br>19       490.13<br>629      382.24<br>23549    245.44<br>30087    617.12<br>Name: pami, dtype: object<br><br><br><b>print(df2[df2['pami'].isin(['382.24', '627.12'])])</b><br><div><br></div><div><span style="color:rgb(255,0,0)">- En esta salida tengo un inconveniente, paso 2 valores: 382.24 y 627.12 y solo muestra 1, qué estoy haciendo mal?</span><br></div><div><br></div>Salida:<br>           lab    pami<br>629  Alcon  382.24<br><br><br><b>print(df2.isin({'pami': [1, 3]}))</b><br><div><br></div><div><span style="color:rgb(255,0,0)">- Acá paso también 2 valores: 1 y 3, no entiendo porque me muestra valores booleanos, en realidad no se que estaría chequeando</span><br></div><div><br></div>Salida:<br>              lab   pami<br>19        False  False<br>629      False  False<br>23549  False  False<br><div>30087  False  False</div><div><br></div><div>Muchas gracias, saludos<br></div><div><br></div></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>
</blockquote></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>