Pandas es una herramienta de manipulación de datos de alto nivel desarrollada por Wes McKinney. Es construido sobre Numpy y permite el análisis de datos que cuenta con las estructuras de datos que necesitamos para limpiar los datos en bruto y que sean aptos para el análisis (por ejemplo, tablas). Como Pandas permite realizar tareas importantes, como alinear datos para su comparación, fusionar conjuntos de datos, gestión de datos perdidos, etc., se ha convertido en una librería muy importante para procesar datos a alto nivel en Python (es decir, estadísticas ). Pandas fue diseñada originalmente para gestionar datos financieros, y como alternativo al uso de hojas de cálculo (es decir, Microsoft Excel).
Los principales tipos de datos que pueden representarse con pandas son:
Datos tabulares con columnas de tipo heterogéneo con etiquetas en columnas y filas.
Series temporales
Pandas proporciona herramientas que permiten:
leer y escribir datos en diferentes formatos: CSV, JSON, Excel, bases SQL y formato HDF5
seleccionar y filtrar de manera sencilla tablas de datos en función de posición, valor o etiquetas
fusionar y unir datos
transformar datos aplicando funciones tanto en global como por ventanas
manipulación de series temporales
hacer gráficas
En pandas existen tres tipos básicos de objetos todos ellos basados a su vez en Numpy:
Series (listas, 1D)
DataFrame (tablas, 2D)
Por lo tanto, Pandas nos proporciona las estructuras de datos y funciones necesarias para el análisis de datos.
Instalar Pandas
Pandas ya esta preinstalado si se usa Google Collaboratory, si va realizar una instalacion en su computador
PIP
pip install pandas
Conda
Si instalo Anaconda, pandas ya viene preinstalado
conda install pandas
Importando Pandas
La libreria Pandas se importa de la siguiente manera
import pandas as pd # Importacion estandar de la libreria Pandas
import numpy as np # Importacion estandar de la libreria NumPy
Series
Una serie es el primer tipo de datos de pandas y es muy similar a una matriz NumPy (de hecho está construida sobre el objeto de matriz NumPy). Lo que diferencia un arreglo NumPy de una serie, es que una serie puede tener etiquetas en los ejes, lo que significa que puede ser indexada por una etiqueta, en lugar de solo una ubicación numérica. Tampoco necesita contener datos numéricos, puede contener cualquier Objeto de Python arbitrario.
Creando una Serie
Puede convertir una lista, una matriz numpy o un diccionario en una serie, usando el metodo pd.Series:
# Crear diferentes tipos de datos
labels = ['a','b','c'] # lista de eetiquetas
my_list = [10,20,30] # lista con valores
arr = np.array([10,20,30]) # Convertir ista de valores en arreglo NumPy
d = {'a':10,'b':20,'c':30} # Creacion de un diccionario
Desde Listas
# Convertir una lista en series usando el metodo pd.Series
# observe que se crean los nombres con las posiciones de cada elemento
pd.Series(data=my_list)
0 10
1 20
2 30
dtype: int64
# Convertir una lista en series usando el metodo pd.Series
# se puede ingresar el nombre de las posiciones
pd.Series(data=my_list,index=labels)
a 10
b 20
c 30
dtype: int64
# No es necesario ingresar la palabra de 'data ='' en el argumento
pd.Series(my_list,labels)
a 10
b 20
c 30
dtype: int64
Desde Arreglos NumPy
# Convertir un arreglo en series usando el metodo pd.Series
pd.Series(arr)
0 10
1 20
2 30
dtype: int64
# Convertir un arreglo en series indicando tambien los valores del index
pd.Series(arr,labels)
a 10
b 20
c 30
dtype: int64
Desde un Diccionario
# Convertir un diccionario en series usando el metodo pd.Series
# Como el diccionario ya tiene clave entonces se le asigna como valor de la posicion
pd.Series(d)
a 10
b 20
c 30
dtype: int64
Datos en una Series
Una serie de pandas puede contener una variedad de tipos de objetos:
# Creando una serie basado solo en una lista de letras
pd.Series(data=labels)
0 a
1 b
2 c
dtype: object
Indexacion
La clave para usar una serie es entender su índice. Pandas hace uso de estos nombres o números de índice al permitir búsquedas rápidas de información (funciona como una tabla hash o diccionario).
Veamos algunos ejemplos de cómo obtener información de una serie. Vamos a crear dos series, ser1 y ser2:
# Creacion de una serie con sus labels o indices
ser1 = pd.Series([1,2,3,4],index = ['USA', 'Germany','USSR', 'Japan'])
ser1
USA 1
Germany 2
USSR 3
Japan 4
dtype: int64
# Creacion de una serie con sus labels o indices
ser2 = pd.Series([1,2,5,4],index = ['USA', 'Germany','Italy', 'Japan'])
ser2
USA 1
Germany 2
Italy 5
Japan 4
dtype: int64
# La busqueda en una serie es igual como en un diccionario
ser1['USA']
1
# La busqueda en una serie es igual como en un diccionario
ser2['Germany']
2
Las operaciones también se realizan según el índice:
# Observe los resultados de los paises que solo estan en una serie y no en las dos
ser1 + ser2
Germany 4.0
Italy NaN
Japan 8.0
USA 2.0
USSR NaN
dtype: float64
DataFrames
Los DataFrames son la estructura mas importante en pandas y están directamente inspirados en el lenguaje de programación R. Se puede pensar en un DataFrame como un conjunto de Series reunidas que comparten el mismo índice.
En los DataFrame tenemos la opción de especificar tanto el index (el nombre de las filas) como columns (el nombre de las columnas).
# Importar la funcion de NumPy para crear arreglos de numeros enteros
from numpy.random import randn
np.random.seed(101) # Inicializar el generador aleatorio
# Forma rapida de crear una lista de python desde strings
'A B C D E'.split()
['A', 'B', 'C', 'D', 'E']
# Crear un dataframe con numeros aleatorios de 4 Columnas y 5 Filas
# Crear listas rapidamente usando la funcion split 'A B C D E'.split()
# Esto evita tener que escribir repetidamente las comas
df = pd.DataFrame(randn(5,4),
index='A B C D E'.split(),
columns='W X Y Z'.split())
df
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
Descripcion general del dataframe
Numero de Filas y Columnas
df.shape # retorna un Tuple asi: (filas, col)
(5, 4)
Informacion General de los datos
# Informacion general de los datos de cada cloumna
# Indica el numero de filas del dataset
# Muestra el numero de datos No Nulos por columna (valores validos)
# Tipo de dato de cada columna
# Tamaño total del dataset
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 4 columns):
W 5 non-null float64
X 5 non-null float64
Y 5 non-null float64
Z 5 non-null float64
dtypes: float64(4)
memory usage: 200.0+ bytes
# Tipos de datos que existen en las columnas del dataframe
df.dtypes
W float64
X float64
Y float64
Z float64
dtype: object
Resumen de estadistica descriptiva General
el metodo .describe() de los dataframes presenta un resumen de la estadistica descriptiva general de las columnas numericas del dataframe, presenta la informacion de:
Promedio (mean)
Desviacion estandard (std)
Valor minimo
Valor maximo
Cuartiles (25%, 50% y 75%)
df.describe() # No muestra la informacion de las columnas categoricas
W
X
Y
Z
count
5.000000
5.000000
5.000000
5.000000
mean
0.343858
0.453764
0.452287
0.431871
std
1.681131
1.061385
1.454516
0.594708
min
-2.018168
-0.758872
-0.933237
-0.589001
25%
0.188695
-0.319318
-0.848077
0.503826
50%
0.190794
0.628133
0.528813
0.605965
75%
0.651118
0.740122
0.907969
0.683509
max
2.706850
1.978757
2.605967
0.955057
Ver Primeros elementos del dataframe
df.head()
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
Ver Ultimos elementos del dataframe
df.tail()
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
Seleccion y Indexacion
Existen diversos métodos para tomar datos de un DataFrame
# Regresara todos los datos de la columna W
df['W']
A 2.706850
B 0.651118
C -2.018168
D 0.188695
E 0.190794
Name: W, dtype: float64
# Seleccionar dos o mas columnas
# Pasar una lista con los nombres de las columnas
df[['W','Z']]
W
Z
A
2.706850
0.503826
B
0.651118
0.605965
C
-2.018168
-0.589001
D
0.188695
0.955057
E
0.190794
0.683509
# Seleccionar dos o mas columnas
# Pasar una lista con los nombres de las columnas
# Puedo indicar el orden de las columnas
df[['X','W','Z']]
X
W
Z
A
0.628133
2.706850
0.503826
B
-0.319318
0.651118
0.605965
C
0.740122
-2.018168
-0.589001
D
-0.758872
0.188695
0.955057
E
1.978757
0.190794
0.683509
Las columnas de un DataFrame Columns son solo Series
type(df['W']) # Tipos de datos
pandas.core.series.Series
Creando una Nueva Columna
# Nueva columna igual a la suma de otras dos
# operacion vectorizada
df['new'] = df['W'] + df['Y']
df
# No se aplica a el dataframe a menos que se especifique.
# Como se ve la operacion pasada no quedo grabada
df
W
X
Y
Z
new
A
2.706850
0.628133
0.907969
0.503826
3.614819
B
0.651118
-0.319318
-0.848077
0.605965
-0.196959
C
-2.018168
0.740122
0.528813
-0.589001
-1.489355
D
0.188695
-0.758872
-0.933237
0.955057
-0.744542
E
0.190794
1.978757
2.605967
0.683509
2.796762
# Para que quede grabado se puede hacer de dos formas
# df = df.drop('new',axis=1) # Forma 1
df.drop('new', axis=1, inplace=True) # Forma 2
df
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
df
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
También se puede sacar filas de esta manera:
df.drop('E',axis=0)
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
df
W
X
Y
Z
A
2.706850
0.628133
0.907969
0.503826
B
0.651118
-0.319318
-0.848077
0.605965
C
-2.018168
0.740122
0.528813
-0.589001
D
0.188695
-0.758872
-0.933237
0.955057
E
0.190794
1.978757
2.605967
0.683509
# Otra manera de borrar las columnas es
del df['X'] # Esta funcion es INPLACE
df
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
C
-2.018168
0.528813
-0.589001
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
Obtener los nombres de las columnas y los indices (index):
df.columns # nombres de las columnas
Index(['W', 'Y', 'Z'], dtype='object')
df.index # nombres de los indices
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
Seleccionando Filas y Columnas
las dos formas de seleccion principal son:
DataFrame.loc[etiqueta_fila, etiqueta_columna] <- por etiquetas
DataFrame.iloc[indice_fila, indice_columna] <- por indices
# la funcion loc busca por medio de los nombres de los indices y columnas
df.loc['A'] # se selecciona todos los valores de la fila 'A'
W 2.706850
Y 0.907969
Z 0.503826
Name: A, dtype: float64
O basado en la posicion (index) en vez de usar la etiqueta
df.iloc[2] # Se seleccionan los valores de la fila con indice 2
# recordar que los index empiezan en cero
W -2.018168
Y 0.528813
Z -0.589001
Name: C, dtype: float64
Seleccionar un subconjunto de filas y columnas
# Mediante etiquetas
# se selecciona el elemento que esta en la fila=B Col=Y
df.loc['B','Y'] # con etiquetas
-0.8480769834036315
# Mediante etiquetas
# se selecciona un subconjunto de datos que estan entre
# filas = A, B Cols= W, Y
df.loc[['A','B'],['W','Y']]
W
Y
A
2.706850
0.907969
B
0.651118
-0.848077
df.loc[['B','A'],['Y','W']]
Y
W
B
-0.848077
0.651118
A
0.907969
2.706850
Seleccion Condicional o Filtros
Una característica importante de pandas es la selección condicional usando la notación de corchetes, muy similar a NumPy:
df
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
C
-2.018168
0.528813
-0.589001
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
# Devuelve un dataframe con booleans
# segun si se cumple o no la condicion
df>0
W
Y
Z
A
True
True
True
B
True
False
True
C
False
True
False
D
True
False
True
E
True
True
True
# Esta operacion solo mostrara los valores del dataframe que cumplen la condicion
# los que no cumplen devuelve el valor NaN
df[df>0]
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
NaN
0.605965
C
NaN
0.528813
NaN
D
0.188695
NaN
0.955057
E
0.190794
2.605967
0.683509
# seleccionar todas las filas donde el valor
# que esta en la columna 'W' sea mayor que cero
df[df['W']>0]
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
# Seleccionar las filas donde 'W' sea mayor que cero
# y de esas filas escoger los valores de la columna 'Y'
df[df['W']>0]['Y']
A 0.907969
B -0.848077
D -0.933237
E 2.605967
Name: Y, dtype: float64
# Seleccionar las filas donde 'W' sea mayor que cero
# y de esas filas escoger los valores de las columna 'Y' y 'X'
df[df['W']>0][['Y','Z']]
Y
Z
A
0.907969
0.503826
B
-0.848077
0.605965
D
-0.933237
0.955057
E
2.605967
0.683509
Para dos condiciones, se usa los booleanos de esta forma
| en vez de or
& en vez de and
~ en vez de not
Por amor a Dios, recuerde usar paréntesis:
# Seleccionar las filas donde 'W' sea mayor que cero
# y tambien donde 'Y' sea mayor que 0.5
df[(df['W']>0) & (df['Y'] > 0.5)]
W
Y
Z
A
2.706850
0.907969
0.503826
E
0.190794
2.605967
0.683509
.query() Busqueda condicional
Los terminos de busqueda condicional o filtros se entregan al metodo como tipo ‘string’
df
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
C
-2.018168
0.528813
-0.589001
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
# seleccionar todas las filas donde el valor
# que esta en la columna 'W' sea mayor que cero
#df[df['W']>0]
df.query('W>0')
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
# Seleccionar las filas donde 'W' sea mayor que cero
# y de esas filas escoger los valores de la columna 'Y'
#df[df['W']>0]['Y']
df.query('W>0')['Y']
A 0.907969
B -0.848077
D -0.933237
E 2.605967
Name: Y, dtype: float64
# Seleccionar las filas donde 'W' sea mayor que cero
# y de esas filas escoger los valores de las columna 'Y' y 'X'
#df[df['W']>0][['Y','Z']]
df.query('W>0')[['Y','Z']]
Y
Z
A
0.907969
0.503826
B
-0.848077
0.605965
D
-0.933237
0.955057
E
2.605967
0.683509
Para dos condiciones, puede usar | = or y & = and con paréntesis:
# Seleccionar las filas donde 'W' sea mayor que cero
# y tambien donde 'Y' sea mayor que 0.5
#df[(df['W']>0) & (df['Y'] > 0.5)]
df.query('W>0 and Y>0.5')
W
Y
Z
A
2.706850
0.907969
0.503826
E
0.190794
2.605967
0.683509
Cambio de columna de Indexacion
Analicemos algunas características más de la indexación, incluido el restablecimiento del índice o el establecimiento de parametros.
df
W
Y
Z
A
2.706850
0.907969
0.503826
B
0.651118
-0.848077
0.605965
C
-2.018168
0.528813
-0.589001
D
0.188695
-0.933237
0.955057
E
0.190794
2.605967
0.683509
# Reinicializar el indice a su valor por defecto 0,1...n index
df = df.reset_index()
df
index
W
Y
Z
0
A
2.706850
0.907969
0.503826
1
B
0.651118
-0.848077
0.605965
2
C
-2.018168
0.528813
-0.589001
3
D
0.188695
-0.933237
0.955057
4
E
0.190794
2.605967
0.683509
newind = 'CA NY WY OR CO'.split() # crear una lista con strings
newind
['CA', 'NY', 'WY', 'OR', 'CO']
# Agregar la lista creaada en el paso anterior al dataframe
df['States'] = newind
df
index
W
Y
Z
States
0
A
2.706850
0.907969
0.503826
CA
1
B
0.651118
-0.848077
0.605965
NY
2
C
-2.018168
0.528813
-0.589001
WY
3
D
0.188695
-0.933237
0.955057
OR
4
E
0.190794
2.605967
0.683509
CO
# Redefinir la columna states como el indice
df.set_index('States')
index
W
Y
Z
States
CA
A
2.706850
0.907969
0.503826
NY
B
0.651118
-0.848077
0.605965
WY
C
-2.018168
0.528813
-0.589001
OR
D
0.188695
-0.933237
0.955057
CO
E
0.190794
2.605967
0.683509
# por que no queda establecido el indice?
df
index
W
Y
Z
States
0
A
2.706850
0.907969
0.503826
CA
1
B
0.651118
-0.848077
0.605965
NY
2
C
-2.018168
0.528813
-0.589001
WY
3
D
0.188695
-0.933237
0.955057
OR
4
E
0.190794
2.605967
0.683509
CO
# para establecer el indice debe ser una funcion inplace
df.set_index('States',inplace=True)
#df = df.set_index('States') # otra forma de hacerlo
df
index
W
Y
Z
States
CA
A
2.706850
0.907969
0.503826
NY
B
0.651118
-0.848077
0.605965
WY
C
-2.018168
0.528813
-0.589001
OR
D
0.188695
-0.933237
0.955057
CO
E
0.190794
2.605967
0.683509
Groupby (Agrupacion por filas)
El método groupby le permite agrupar filas de datos y llamar a funciones agregadas
import pandas as pd
# Crear dataframe desde un diccionario
data = {'Company':['GOOG','GOOG','MSFT','MSFT','FB','FB'],
'Person':['Sam','Charlie','Amy','Vanessa','Carl','Sarah'],
'Sales':[200,120,340,124,243,350]}
data
#conversion del diccionario a dataframe
df = pd.DataFrame(data)
df
Company
Person
Sales
0
GOOG
Sam
200
1
GOOG
Charlie
120
2
MSFT
Amy
340
3
MSFT
Vanessa
124
4
FB
Carl
243
5
FB
Sarah
350
Se puede usar el método .groupby() para agrupar filas en función de un nombre de columna. Por ejemplo, vamos a agruparnos a partir de la Compañía. Esto creará un objeto DataFrameGroupBy:
#agrupar por Company
df.groupby('Company')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f059acb5128>
Se puede grabar este objeto en una nueva variable:
by_comp = df.groupby("Company")
utilizar los métodos agregados del objeto:
# Promedio de ventas por company
by_comp.mean()
Sales
Company
FB
296.5
GOOG
160.0
MSFT
232.0
# agrupar por compañia y calcular el promedio por cada una
df.groupby('Company').mean()
Sales
Company
FB
296.5
GOOG
160.0
MSFT
232.0
Más ejemplos de métodos agregados:
# agrupar por compañia y calcular la desviacion estandard
by_comp.std()
Sales
Company
FB
75.660426
GOOG
56.568542
MSFT
152.735065
# agrupar por compañia y calcular el minimo
by_comp.min()
Person
Sales
Company
FB
Carl
243
GOOG
Charlie
120
MSFT
Amy
124
# agrupar por compañia y calcular el maximo
by_comp.max()
Person
Sales
Company
FB
Sarah
350
GOOG
Sam
200
MSFT
Vanessa
340
# agrupar por compañia y sumar los elementos que hay excluyendo los NaN
by_comp.count()
Person
Sales
Company
FB
2
2
GOOG
2
2
MSFT
2
2
# Una de las funciones mas usadas para descripcion estadistica de un dataframe
# Genera estadísticas descriptivas que resumen la tendencia central, la dispersión y la forma de la distribución de un conjunto de datos, excluyendo los valores `` NaN``.
# by_comp.describe(include = 'all') # incluir todo
by_comp.describe()
Sales
count
mean
std
min
25%
50%
75%
max
Company
FB
2.0
296.5
75.660426
243.0
269.75
296.5
323.25
350.0
GOOG
2.0
160.0
56.568542
120.0
140.00
160.0
180.00
200.0
MSFT
2.0
232.0
152.735065
124.0
178.00
232.0
286.00
340.0
# Una de las funciones mas usadas para descripcion estadistica de un dataframe
# Genera estadísticas descriptivas que resumen la tendencia central, la dispersión y la forma de la distribución de un conjunto de datos, excluyendo los valores `` NaN``.
# Transponer la descripcion
by_comp.describe().transpose()
Company
FB
GOOG
MSFT
Sales
count
2.000000
2.000000
2.000000
mean
296.500000
160.000000
232.000000
std
75.660426
56.568542
152.735065
min
243.000000
120.000000
124.000000
25%
269.750000
140.000000
178.000000
50%
296.500000
160.000000
232.000000
75%
323.250000
180.000000
286.000000
max
350.000000
200.000000
340.000000
# Descripcion estadistica de los datos de la copmañia GOOG
by_comp.describe().transpose()['GOOG']
Sales count 2.000000
mean 160.000000
std 56.568542
min 120.000000
25% 140.000000
50% 160.000000
75% 180.000000
max 200.000000
Name: GOOG, dtype: float64
Pivot Tables
La funcionlidad “Pivot_table” es muy utilizada y popular en las conocidas “hojas de cálculo” tipo, OpenOffice, LibreOffice, Excel, Lotus, etc. Esta funcionalidad nos permite agrupar, ordenar, calcular datos y manejar datos de una forma muy similar a la que se hace con las hojas de cálculo.
mas informacion
La principal función del “Pivot_table” son las agrupaciones de datos a las que se les suelen aplicar funciones matemáticas como sumatorios, promedios, etc
import seaborn as sns # importar la libreria seaborn
# cargar dataset del titanic
titanic = sns.load_dataset('titanic')
titanic.head()
survived
pclass
sex
age
sibsp
parch
fare
embarked
class
who
adult_male
deck
embark_town
alive
alone
0
0
3
male
22.0
1
0
7.2500
S
Third
man
True
NaN
Southampton
no
False
1
1
1
female
38.0
1
0
71.2833
C
First
woman
False
C
Cherbourg
yes
False
2
1
3
female
26.0
0
0
7.9250
S
Third
woman
False
NaN
Southampton
yes
True
3
1
1
female
35.0
1
0
53.1000
S
First
woman
False
C
Southampton
yes
False
4
0
3
male
35.0
0
0
8.0500
S
Third
man
True
NaN
Southampton
no
True
Haciendo el Pivot table a mano para obtener el promedio de personas que sobrevivieron por genero
# 1. Agrupar por genero
# 2. Obtener los sobrevivientes
# 3. Calcular el promedio
titanic.groupby('sex')[['survived']].mean()
survived
sex
female
0.742038
male
0.188908
promedio de cuantos sobrevivieron por genero divididos por clase
# 1. Agrupar por genero y clase
# 2. Obtener los sobrevivientes
# 3. Calcular el promedio
# 4. Poner el resultado como una tabla (.unstack)
titanic.groupby(['sex', 'class'])['survived'].mean().unstack()
La concatenación básicamente combina DataFrames. Tenga en cuenta que las dimensiones deben coincidir a lo largo del eje con el que se está concatenando.
la concatenacion se hace con dataframes de diferentes indices
Puede usar .concat() y pasar una lista de DataFrames para concatenar juntos:
# Concatenar cada dateframe verticalmente, ya que coinciden los nombres de las columnas
pd.concat([df1,df2,df3])
A
B
C
D
0
A0
B0
C0
D0
1
A1
B1
C1
D1
2
A2
B2
C2
D2
3
A3
B3
C3
D3
4
A4
B4
C4
D4
5
A5
B5
C5
D5
6
A6
B6
C6
D6
7
A7
B7
C7
D7
8
A8
B8
C8
D8
9
A9
B9
C9
D9
10
A10
B10
C10
D10
11
A11
B11
C11
D11
#concatenar dataframe horizontalmente, como no coinciden los index observar lo que ocurre
pd.concat([df1,df2,df3],axis=1)
A
B
C
D
A
B
C
D
A
B
C
D
0
A0
B0
C0
D0
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
1
A1
B1
C1
D1
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
2
A2
B2
C2
D2
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
3
A3
B3
C3
D3
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
4
NaN
NaN
NaN
NaN
A4
B4
C4
D4
NaN
NaN
NaN
NaN
5
NaN
NaN
NaN
NaN
A5
B5
C5
D5
NaN
NaN
NaN
NaN
6
NaN
NaN
NaN
NaN
A6
B6
C6
D6
NaN
NaN
NaN
NaN
7
NaN
NaN
NaN
NaN
A7
B7
C7
D7
NaN
NaN
NaN
NaN
8
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
A8
B8
C8
D8
9
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
A9
B9
C9
D9
10
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
A10
B10
C10
D10
11
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
A11
B11
C11
D11
Fusion (Merging)
La función merge() le permite fusionar DataFrames juntos utilizando una lógica similar a la combinación de Tablas SQL. Por ejemplo:
# DataFrames de ejemplo para merging
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
left
key
A
B
0
K0
A0
B0
1
K1
A1
B1
2
K2
A2
B2
3
K3
A3
B3
right
key
C
D
0
K0
C0
D0
1
K1
C1
D1
2
K2
C2
D2
3
K3
C3
D3
# how='inner' utilice la intersección de las claves de ambos marcos, similar a una combinación interna de SQL;
# las keys son comunes
pd.merge(left,right,how='inner',on='key')
key
A
B
C
D
0
K0
A0
B0
C0
D0
1
K1
A1
B1
C1
D1
2
K2
A2
B2
C2
D2
3
K3
A3
B3
C3
D3
Un ejemplo mas complicado:
Natural join: para mantener solo las filas que coinciden con los marcos de datos, especifique el argumento how = ‘inner’.
Full outer join: para mantener todas las filas de ambos dataframe, especifique how = ‘OUTER’.
Left outer join: para incluir todas las filas de su dataframe x y solo aquellas de y que coincidan, especifique how=‘left’.
Right outer join: para incluir todas las filas de su dataframe y y solo aquellas de x que coincidan, especifique how=‘right’.
# fusionando comparando las mismas claves que tengan comunes
pd.merge(left, right, on=['key1', 'key2'])
key1
key2
A
B
C
D
0
K0
K0
A0
B0
C0
D0
1
K1
K0
A2
B2
C1
D1
2
K1
K0
A2
B2
C2
D2
# fusionando totalmente las dos tablas con las claves
pd.merge(left, right, how='outer', on=['key1', 'key2'])
key1
key2
A
B
C
D
0
K0
K0
A0
B0
C0
D0
1
K0
K1
A1
B1
NaN
NaN
2
K1
K0
A2
B2
C1
D1
3
K1
K0
A2
B2
C2
D2
4
K2
K1
A3
B3
NaN
NaN
5
K2
K0
NaN
NaN
C3
D3
# fusionando usando las claves de la tabla right
pd.merge(left, right, how='right', on=['key1', 'key2'])
key1
key2
A
B
C
D
0
K0
K0
A0
B0
C0
D0
1
K1
K0
A2
B2
C1
D1
2
K1
K0
A2
B2
C2
D2
3
K2
K0
NaN
NaN
C3
D3
# fusionando usando las claves de la tabla left
pd.merge(left, right, how='left', on=['key1', 'key2'])
key1
key2
A
B
C
D
0
K0
K0
A0
B0
C0
D0
1
K0
K1
A1
B1
NaN
NaN
2
K1
K0
A2
B2
C1
D1
3
K1
K0
A2
B2
C2
D2
4
K2
K1
A3
B3
NaN
NaN
Unir (Joining)
Unir (join) es un método conveniente para combinar las columnas de dos DataFrames potencialmente indexados de forma diferente en un solo DataFrame.
Join hace uniones de índices sobre índices o de índices sobre columnas
# Creando primero los datos y luego convirtiendolos en categoricos
df_cate = pd.DataFrame({"Fruta":["manzana", "banano", "corozo", "manzana","pera"]})
df_cate
Fruta
0
manzana
1
banano
2
corozo
3
manzana
4
pera
# Observar los tipos de datos en el data frame
df_cate.dtypes
# Observar los tipos de datos en el dataframe
df_cate.dtypes
Fruta object
Fruta2 category
dtype: object
# Crear los datos categoricos desde a declaracion de los datos
df_cate = pd.DataFrame({'A': list('abca'), 'B': list('bccd')}, dtype="category")
df_cate
A
B
0
a
b
1
b
c
2
c
c
3
a
d
df_cate.dtypes
A category
B category
dtype: object
df_cate.describe()
A
B
count
4
4
unique
3
3
top
a
c
freq
2
2
Categoricos Ordinales
from pandas.api.types import CategoricalDtype
# creacion de dataframe con datos
df_cate = pd.DataFrame({'A': list('abca'), 'B': list('bccd')})
df_cate
A
B
0
a
b
1
b
c
2
c
c
3
a
d
df_cate.dtypes
A object
B object
dtype: object
# Definicion de los tipos de datos y que estan en orden
df_cate["A"] = df_cate["A"].astype(CategoricalDtype(['a','b','c','d'], ordered=True))
df_cate
A
B
0
a
b
1
b
c
2
c
c
3
a
d
df_cate["A"]
0 a
1 b
2 c
3 a
Name: A, dtype: category
Categories (4, object): [a < b < c < d]
# Los datos no tienen que ser strngs para qeu sean categoricos
s = pd.Series([1, 2, 3, 1], dtype="category")
s
# Declaracion de data frame con algunos datos faltantes
# NaN = Not a Number
df = pd.DataFrame({'A':[1,2,np.nan],
'B':[5,np.nan,np.nan],
'C':[1,2,3]})
df
A
B
C
0
1.0
5.0
1
1
2.0
NaN
2
2
NaN
NaN
3
Detectar si Faltan datos
# verificar cuales valores son NaN o nulos (Null)
df.isna()
A
B
C
0
False
False
False
1
False
True
False
2
True
True
False
# verificar cuales valores son na
# el metodo .isnull() es igual a .isna()
df.isnull()
A
B
C
0
False
False
False
1
False
True
False
2
True
True
False
# Verificar si hay datos faltantes por columna
df.isnull().any()
A True
B True
C False
dtype: bool
Numero de datos faltantes
Calcular el numero de datos nulos que hay por columna
# Numero de datos faltantes por columna
df.isnull().sum()
A 1
B 2
C 0
dtype: int64
Eliminar datos Faltantes
# Eliminar todas las filas que tengan datos faltantes
df.dropna(axis=0) # cuando son filas no es neceario escribir axis=0
A
B
C
0
1.0
5.0
1
# Eliminar todas las columnas que tengan datos faltantes
df.dropna(axis=1)
C
0
1
1
2
2
3
# eliminar las filas que tengas 2 o mas valores NaN
df.dropna(thresh=2)
A
B
C
0
1.0
5.0
1
1
2.0
NaN
2
Reemplazar los datos faltantes
# Llenar los datos faltantes con el dato que nos interese
df.fillna(value='FILL VALUE') # llenar los espacios con un string
# puede ser una palabra, numero , etc
A
B
C
0
1
5
1
1
2
FILL VALUE
2
2
FILL VALUE
FILL VALUE
3
# Llenar los datos faltantes con el dato que nos interese
df.fillna(value=99) # llenar los espacios con un numero
A
B
C
0
1.0
5.0
1
1
2.0
99.0
2
2
99.0
99.0
3
# Llenar los datos faltantes con el promedio de esa columna
df['A'].fillna(value=df['A'].mean())
0 1.0
1 2.0
2 1.5
Name: A, dtype: float64
# Llenar los datos faltantes con el promedio de cada columna
df.fillna(value=df.mean())
A
B
C
0
1.0
5.0
1
1
2.0
5.0
2
2
1.5
5.0
3
Datos unicos (Unique Values)
import pandas as pd
# crear un dataframe
df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})
df.head() # solamente mostrar los primeros elementos del dataframe
col1
col2
col3
0
1
444
abc
1
2
555
def
2
3
666
ghi
3
4
444
xyz
# valores unicos de la columna col2
df['col2'].unique()
array([444, 555, 666])
# Numero de valores unicos en el dataframe
df['col2'].nunique()
3
# contar cuanto se repiten cada uno de los valores
df['col2'].value_counts()
444 2
555 1
666 1
Name: col2, dtype: int64
Datos Duplicados
Se puede borrar los registros que son exactamente iguales en todos los valores de las columnas
import pandas as pd
# crear un dataframe
df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],
'col3':['mama ',' papa',' HIJO ','HiJa']})
df.head() # solamente mostrar los primeros elementos del dataframe
col1
col2
col3
0
1
444
mama
1
2
555
papa
2
3
666
HIJO
3
4
444
HiJa
Metodos Basicos Pandas
Ejemplos simples de los metodos de los dataframe de pandas
Para informacion completa de los metodos de computacion y estadisticos ver:
Los calculos de las medidas estadisticas se hacen siempre en columnas, es algo predeterminado, si se quiere hacer por filas, se debe especificar dentro de los metodos el parametro axis=1.
Ejemplo:
Calculo de la media por columnas (predeterminado) = df.mean()
Calculo de la media por filas = df.mean(axis=1)
Esto funciona con los otros tipos de medidas estadisticas
# Se tomara la columna 'mpg' para realizar los calculos
X = data['mpg']
type(X)
pandas.core.series.Series
Medidas de centralizacion
estas funciones se aplican sobre un dataframe de pandas
La asimetría es la medida que indica la simetría de la distribución de una variable respecto a la media aritmética, sin necesidad de hacer la representación gráfica. Los coeficientes de asimetría indican si hay el mismo número de elementos a izquierda y derecha de la media.
Existen tres tipos de curva de distribución según su asimetría:
Asimetría negativa: la cola de la distribución se alarga para valores inferiores a la media.
Simétrica: hay el mismo número de elementos a izquierda y derecha de la media. En este caso, coinciden la media, la mediana y la moda. La distribución se adapta a la forma de la campana de Gauss, o distribución normal.
Asimetría positiva: la cola de la distribución se alarga para valores superiores a la media.
#unbiased skew, Normalized by N-1
X.skew()
0.45706634399491913
#unbiased skew, Normalized by N-1 en un dataframe
data.skew()
Esta medida determina el grado de concentración que presentan los valores en la región central de la distribución. Por medio del Coeficiente de Curtosis, podemos identificar si existe una gran concentración de valores (Leptocúrtica), una concentración normal (Mesocúrtica) ó una baja concentración (Platicúrtica).
# unbiased kurtosis over requested axis using Fisher's definition
X.kurtosis()
-0.5107812652123154
# unbiased kurtosis over requested axis using Fisher's definition
# en un dataframe
data.kurtosis()
# conocer los tipos de datos de cada columna
df1.dtypes
ID int64
Address object
City object
State object
Country object
Name object
Employees int64
dtype: object
# Tambien se puede cambiar el valor de la columna index
# definir la columna ID como el index
df1.set_index("ID",inplace=True) # se debe especificar que sea inplace
df1
Address
City
State
Country
Name
Employees
ID
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
8
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
15
3
332 Hill St
San Francisco
California 94114
USA
Super River
25
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
10
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
12
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
20
# hare un cambio y luego lo grabare
# multiplicar cada elemento de la columna employees por 2
df1['Employees']= df1['Employees'].apply(lambda x: x*2)
df1
Address
City
State
Country
Name
Employees
ID
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
16
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
30
3
332 Hill St
San Francisco
California 94114
USA
Super River
50
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
20
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
24
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
40
CSV Output
# Grabar el dataframe como archivo separado por comas
df1.to_csv('./Data/example_out.csv',index=False)
Archivo de texto separado por comas
# Leer archivos separados por comas, extension .txt o sin extension
df1 = pd.read_csv("./Data/supermarkets-commas.txt")
df1
ID
Address
City
State
Country
Name
Employees
0
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
8
1
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
15
2
3
332 Hill St
San Francisco
California 94114
USA
Super River
25
3
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
10
4
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
12
5
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
20
Archivo de texto separado por otro caracter
# este archivo los valores estan separados por ;
df1 = pd.read_csv("./Data/supermarkets-semi-colons.txt",sep=';')
df1
ID
Address
City
State
Country
Name
Employees
0
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
8
1
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
15
2
3
332 Hill St
San Francisco
California 94114
USA
Super River
25
3
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
10
4
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
12
5
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
20
Excel
Pandas puede leer y escribir archivos de Excel, tenga en cuenta que esto solo importa datos. No fórmulas o imágenes, que tengan imágenes o macros pueden hacer que este método read_excel se bloquee.
Excel Input
# leer un archivo de excel
df2 = pd.read_excel("./Data/supermarkets.xlsx",sheet_name=0) #leer la primera hoja del archivo
df2
ID
Address
City
State
Country
Supermarket Name
Number of Employees
0
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
8
1
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
15
2
3
332 Hill St
San Francisco
California 94114
USA
Super River
25
3
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
10
4
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
12
5
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
20
# tambien podemos cambiar la columna del index
df2.set_index('ID')
df2
ID
Address
City
State
Country
Supermarket Name
Number of Employees
0
1
3666 21st St
San Francisco
CA 94114
USA
Madeira
8
1
2
735 Dolores St
San Francisco
CA 94119
USA
Bready Shop
15
2
3
332 Hill St
San Francisco
California 94114
USA
Super River
25
3
4
3995 23rd St
San Francisco
CA 94114
USA
Ben's Shop
10
4
5
1056 Sanchez St
San Francisco
California
USA
Sanchez
12
5
6
551 Alvarado St
San Francisco
CA 94114
USA
Richvalley
20
Excel Output
# sumar cada elemento del data frame por 4
df2['Number of Employees'] = df2['Number of Employees'].apply(lambda x: x+4)
df2
JSON (JavaScript Object Notation - Notación de Objetos de JavaScript) es un formato ligero de intercambio de datos. Leerlo y escribirlo es simple para humanos, mientras que para las máquinas es simple interpretarlo y generarlo.
Json Input
# los archivos pueden estar en un link de internet
df4 = pd.read_json("http://pythonhow.com/supermarkets.json")
df4
Address
City
Country
Employees
ID
Name
State
0
3666 21st St
San Francisco
USA
8
1
Madeira
CA 94114
1
735 Dolores St
San Francisco
USA
15
2
Bready Shop
CA 94119
2
332 Hill St
San Francisco
USA
25
3
Super River
California 94114
3
3995 23rd St
San Francisco
USA
10
4
Ben's Shop
CA 94114
4
1056 Sanchez St
San Francisco
USA
12
5
Sanchez
California
5
551 Alvarado St
San Francisco
USA
20
6
Richvalley
CA 94114
Json output
#Para grabar
df4.to_json("./Data/Salida.json")
WEKA (arff)
from scipy.io import arff # libreria para importar archivos de weka
# principalmente importa datos numericos
data = arff.loadarff('./Data/yeast-train.arff')
df5 = pd.DataFrame(data[0])
df5.head()
Att1
Att2
Att3
Att4
Att5
Att6
Att7
Att8
Att9
Att10
...
Class5
Class6
Class7
Class8
Class9
Class10
Class11
Class12
Class13
Class14
0
0.093700
0.139771
0.062774
0.007698
0.083873
-0.119156
0.073305
0.005510
0.027523
0.043477
...
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
1
-0.022711
-0.050504
-0.035691
-0.065434
-0.084316
-0.378560
0.038212
0.085770
0.182613
-0.055544
...
b'0'
b'0'
b'1'
b'1'
b'0'
b'0'
b'0'
b'1'
b'1'
b'0'
2
-0.090407
0.021198
0.208712
0.102752
0.119315
0.041729
-0.021728
0.019603
-0.063853
-0.053756
...
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'1'
b'1'
b'0'
3
-0.085235
0.009540
-0.013228
0.094063
-0.013592
-0.030719
-0.116062
-0.131674
-0.165448
-0.123053
...
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'1'
b'1'
b'1'
4
-0.088765
-0.026743
0.002075
-0.043819
-0.005465
0.004306
-0.055865
-0.071484
-0.159025
-0.111348
...
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
b'0'
5 rows × 117 columns
HTML
Se debe instalar htmllib5,lxml y BeautifulSoup4. En la terminal escriba
Luego reinicie el Jupyter Notebook.
(o use pip install si no esta usando la distribucion de Anaconda)
Pandas puede leer tablas de html
La función pandas read_html leerá las tablas de una página web y devolverá una lista de objetos DataFrame:
data = pd.read_html('http://www.fdic.gov/bank/individual/failed/banklist.html')
data[0]
Bank Name
City
ST
CERT
Acquiring Institution
Closing Date
Updated Date
0
The Enloe State Bank
Cooper
TX
10716
Legend Bank, N. A.
May 31, 2019
June 5, 2019
1
Washington Federal Bank for Savings
Chicago
IL
30570
Royal Savings Bank
December 15, 2017
February 1, 2019
2
The Farmers and Merchants State Bank of Argonia
Argonia
KS
17719
Conway Bank
October 13, 2017
February 21, 2018
3
Fayette County Bank
Saint Elmo
IL
1802
United Fidelity Bank, fsb
May 26, 2017
January 29, 2019
4
Guaranty Bank, (d/b/a BestBank in Georgia & Mi...
Milwaukee
WI
30003
First-Citizens Bank & Trust Company
May 5, 2017
March 22, 2018
5
First NBC Bank
New Orleans
LA
58302
Whitney Bank
April 28, 2017
January 29, 2019
6
Proficio Bank
Cottonwood Heights
UT
35495
Cache Valley Bank
March 3, 2017
January 29, 2019
7
Seaway Bank and Trust Company
Chicago
IL
19328
State Bank of Texas
January 27, 2017
January 29, 2019
8
Harvest Community Bank
Pennsville
NJ
34951
First-Citizens Bank & Trust Company
January 13, 2017
May 18, 2017
9
Allied Bank
Mulberry
AR
91
Today's Bank
September 23, 2016
May 13, 2019
10
The Woodbury Banking Company
Woodbury
GA
11297
United Bank
August 19, 2016
December 13, 2018
11
First CornerStone Bank
King of Prussia
PA
35312
First-Citizens Bank & Trust Company
May 6, 2016
November 13, 2018
12
Trust Company Bank
Memphis
TN
9956
The Bank of Fayette County
April 29, 2016
September 14, 2018
13
North Milwaukee State Bank
Milwaukee
WI
20364
First-Citizens Bank & Trust Company
March 11, 2016
January 29, 2019
14
Hometown National Bank
Longview
WA
35156
Twin City Bank
October 2, 2015
February 19, 2018
15
The Bank of Georgia
Peachtree City
GA
35259
Fidelity Bank
October 2, 2015
July 9, 2018
16
Premier Bank
Denver
CO
34112
United Fidelity Bank, fsb
July 10, 2015
February 20, 2018
17
Edgebrook Bank
Chicago
IL
57772
Republic Bank of Chicago
May 8, 2015
January 29, 2019
18
Doral Bank En Español
San Juan
PR
32102
Banco Popular de Puerto Rico
February 27, 2015
January 29, 2019
19
Capitol City Bank & Trust Company
Atlanta
GA
33938
First-Citizens Bank & Trust Company
February 13, 2015
January 29, 2019
20
Highland Community Bank
Chicago
IL
20290
United Fidelity Bank, fsb
January 23, 2015
November 15, 2017
21
First National Bank of Crestview
Crestview
FL
17557
First NBC Bank
January 16, 2015
November 15, 2017
22
Northern Star Bank
Mankato
MN
34983
BankVista
December 19, 2014
January 3, 2018
23
Frontier Bank, FSB D/B/A El Paseo Bank
Palm Desert
CA
34738
Bank of Southern California, N.A.
November 7, 2014
November 10, 2016
24
The National Republic Bank of Chicago
Chicago
IL
916
State Bank of Texas
October 24, 2014
January 6, 2016
25
NBRS Financial
Rising Sun
MD
4862
Howard Bank
October 17, 2014
January 29, 2019
26
GreenChoice Bank, fsb
Chicago
IL
28462
Providence Bank, LLC
July 25, 2014
December 12, 2016
27
Eastside Commercial Bank
Conyers
GA
58125
Community & Southern Bank
July 18, 2014
October 6, 2017
28
The Freedom State Bank
Freedom
OK
12483
Alva State Bank & Trust Company
June 27, 2014
February 21, 2018
29
Valley Bank
Fort Lauderdale
FL
21793
Landmark Bank, National Association
June 20, 2014
January 29, 2019
...
...
...
...
...
...
...
...
526
ANB Financial, NA
Bentonville
AR
33901
Pulaski Bank and Trust Company
May 9, 2008
February 1, 2019
527
Hume Bank
Hume
MO
1971
Security Bank
March 7, 2008
January 31, 2019
528
Douglass National Bank
Kansas City
MO
24660
Liberty Bank and Trust Company
January 25, 2008
October 26, 2012
529
Miami Valley Bank
Lakeview
OH
16848
The Citizens Banking Company
October 4, 2007
September 12, 2016
530
NetBank
Alpharetta
GA
32575
ING DIRECT
September 28, 2007
January 31, 2019
531
Metropolitan Savings Bank
Pittsburgh
PA
35353
Allegheny Valley Bank of Pittsburgh
February 2, 2007
October 27, 2010
532
Bank of Ephraim
Ephraim
UT
1249
Far West Bank
June 25, 2004
April 9, 2008
533
Reliance Bank
White Plains
NY
26778
Union State Bank
March 19, 2004
April 9, 2008
534
Guaranty National Bank of Tallahassee
Tallahassee
FL
26838
Hancock Bank of Florida
March 12, 2004
April 17, 2018
535
Dollar Savings Bank
Newark
NJ
31330
No Acquirer
February 14, 2004
April 9, 2008
536
Pulaski Savings Bank
Philadelphia
PA
27203
Earthstar Bank
November 14, 2003
October 6, 2017
537
First National Bank of Blanchardville
Blanchardville
WI
11639
The Park Bank
May 9, 2003
June 5, 2012
538
Southern Pacific Bank
Torrance
CA
27094
Beal Bank
February 7, 2003
October 20, 2008
539
Farmers Bank of Cheneyville
Cheneyville
LA
16445
Sabine State Bank & Trust
December 17, 2002
October 20, 2004
540
Bank of Alamo
Alamo
TN
9961
No Acquirer
November 8, 2002
March 18, 2005
541
AmTrade International Bank En Español
Atlanta
GA
33784
No Acquirer
September 30, 2002
September 11, 2006
542
Universal Federal Savings Bank
Chicago
IL
29355
Chicago Community Bank
June 27, 2002
October 6, 2017
543
Connecticut Bank of Commerce
Stamford
CT
19183
Hudson United Bank
June 26, 2002
February 14, 2012
544
New Century Bank
Shelby Township
MI
34979
No Acquirer
March 28, 2002
March 18, 2005
545
Net 1st National Bank
Boca Raton
FL
26652
Bank Leumi USA
March 1, 2002
April 9, 2008
546
NextBank, NA
Phoenix
AZ
22314
No Acquirer
February 7, 2002
February 5, 2015
547
Oakwood Deposit Bank Co.
Oakwood
OH
8966
The State Bank & Trust Company
February 1, 2002
October 25, 2012
548
Bank of Sierra Blanca
Sierra Blanca
TX
22002
The Security State Bank of Pecos
January 18, 2002
November 6, 2003
549
Hamilton Bank, NA En Español
Miami
FL
24382
Israel Discount Bank of New York
January 11, 2002
September 21, 2015
550
Sinclair National Bank
Gravette
AR
34248
Delta Trust & Bank
September 7, 2001
October 6, 2017
551
Superior Bank, FSB
Hinsdale
IL
32646
Superior Federal, FSB
July 27, 2001
August 19, 2014
552
Malta National Bank
Malta
OH
6629
North Valley Bank
May 3, 2001
November 18, 2002
553
First Alliance Bank & Trust Co.
Manchester
NH
34264
Southern New Hampshire Bank & Trust
February 2, 2001
February 18, 2003
554
National State Bank of Metropolis
Metropolis
IL
3815
Banterra Bank of Marion
December 14, 2000
March 17, 2005
555
Bank of Honolulu
Honolulu
HI
21029
Bank of the Orient
October 13, 2000
March 17, 2005
556 rows × 7 columns
SQL
El módulo pandas.io.sql proporciona una colección de contenedores de consultas para facilitar la recuperación de datos y reducir la dependencia de la API específica de DB. La abstracción de la base de datos es proporcionada por SQLAlchemy si está instalado. Además, necesitará una biblioteca de controladores para su base de datos. Ejemplos de tales controladores son psycopg2 para PostgreSQL o pymysql para MySQL. Para SQLite esto está incluido en la biblioteca estándar de Python por defecto. Puede encontrar una descripción general de los controladores admitidos para cada lenguaje SQL en los documentos de SQLAlchemy.
Vea también algunos ejemplos de libros para algunas estrategias avanzadas.
las funciones claves son:
read_sql_table(table_name, con[, schema, …])
Read SQL database table into a DataFrame.
read_sql_query(sql, con[, index_col, …])
Read SQL query into a DataFrame.
read_sql(sql, con[, index_col, …])
Read SQL query or database table into a DataFrame.
DataFrame.to_sql(name, con[, flavor, …])
Write records stored in a DataFrame to a SQL database.
# librerias para crear un proceso de sql sencillo
from sqlalchemy import create_engine
# crear un proceso en memoria
engine = create_engine('sqlite:///:memory:')
df4.to_sql('data', engine) # grabar el dataframe en formato sql
sql_df = pd.read_sql('data',con=engine) # definir la conexion