~~stoggle_buttons~~ ===== links ===== * [[https://towardsdatascience.com/5-gotchas-with-pandas-974df6595e61]] * [[https://towardsdatascience.com/6-lesser-nown-yet-awesome-tricks-in-pandas-32236f3785c8]] * [[https://github.com/pandas-dev/pandas2|pandas2]] Está en beta ===== pandas ecosystem ===== Qué hacer si te quedas sin RAM para procesar todos tus datos, quieres encadenar //pipes// de pandas, paralelizar operaciones... * [[https://pandas.pydata.org/pandas-docs/stable/ecosystem.html|Pandas ecosystem]] Otras librerías/plugins de pandas para procesamiento en paralelo o en disco * [[https://blaze.pydata.org/|Blaze ecosystem]] * [[https://github.com/rapidsai/cudf|cudf]] GPU DataFrames * [[https://github.com/shaypal5/pdpipe|pdpipe]] Empipar pandas * [[https://koalas.readthedocs.io/en/latest/|koalas]] Pandas+Spark * [[https://towardsdatascience.com/one-word-of-code-to-stop-using-pandas-so-slowly-793e0a81343c|Swifter con análisis de tiempo]] Pandas es más lento que numpy para hacer cálculos pesados, pero usando Swifter va mucho más rápido ===== df.to_sql ===== engine = create_engine(sqlalchemy_url, fast_executemany=True) data_frame.to_sql(table_name, engine, method="multi") [[https://stackoverflow.com/questions/48006551/speeding-up-pandas-dataframe-to-sql-with-fast-executemany-of-pyodbc]] ==== tipado del DataFrame ==== [[https://github.com/pandas-dev/pandas/issues/13049]] * Ahora mismo, si una query no devuelve resultados, los tipos de las variables cambian a un valor por defecto (los números cambian a cosas como Float64, a veces a Int64, y los Timestamp pasan a ser object, por ejemplo). * Si más adelante asumimos el tipo de una columna específica puede dar lugar a errores en tiempo de ejecución si el DataFrame llega vacío (por ejemplo al hacer merge los tipos tienen que coincidir y si no da un error) * Lo que se puede hacer es asegurarse de los tipos justo después de ejecutar la query para aislar este comportamiento ===== fechas en csv ===== Se pierde el formato de la fecha df.date = pd.to_datetime(df.date, format="%Y-%m-%d") df.date = [x.date() for x in df.date.dt.to_pydatetime()] ===== Aplicar a 2 columnas ===== df['point'] = df[['lat', 'lng']].apply(Point, axis=1) ===== df.isin ===== import pandas as pd df.isin({'columna': }) # Comprueba si cada elemento de esta en df['columna'], es equivalente a un in ===== df.where ===== Si estamos trabajando con algún DataFrame que tenga nulos, hay que tener cuidado de no tirarlos cuando hagamos ''dropna()'', ya que por defecto tiene parámetro ''how='any''' y tira todas las filas que tengan un NaN en alguna columna. df.where(df['a'] > 1).dropna(how='all') ===== filtros temporales ===== * [[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html#pandas.DataFrame.between_time|between_time('0:15', '0:45')]] * [[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.at_time.html#pandas.DataFrame.at_time|at_time]] * Si se usa una fecha como índice, se pueden hacer cosas como ''%%df['2020-01':'2020-02']%%'' ===== df.groupby ===== * Luego para volver a tener un índice tienes que hacer ''.reset_index()'' ===== Pequeños trucos ===== nsmallest() and nlargest() → Cuando tienes un dataframe grande, en vez de sort_values, te saca los N primeros/últimos ne() → not equal idxmin, idxmax → te saca el primer índice/último que cumple una condición ===== df.query ===== filter = df.query(f'id = 1149361 and date < {current_date}') Hace ''dropna()'' automáticamente, así que hay que tener cuidado si hay algún NaN [[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html|Documentación de query]] ===== merge_asof ===== merge por distancia mínima ===== utilidades ===== * ''df.to_clipboard'' * ''pd.options.mode.chained_assignment = None'' para quitar [[https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy|warning]]