preloader

Visualización de dataframes, selección y asignación de datos

Índice de contenido

En primer lugar, haciendo uso de los conceptos aprendidos en la anterior lección, vamos a cargar unos datos en un DataFrame a partir de un archivo descargado del repositorio UCI de Machine Learning: https://archive.ics.uci.edu/ml/datasets/Adult

python
import pandas as pd
import numpy as np
python
file_path = "C:/Users/user/Desktop/adult.data"

col_names = ["age", 
            "workclass",
            "fnlwgt", 
            "education",
            "education-num",
            "marital-status",
            "occupation",
            "relationship",
            "race",
            "sex",
            "capital-gain",
            "capital-loss",
            "hours-per-week",
            "native-country",
            "income"]


df = pd.read_csv(filepath_or_buffer = file_path,
           header = 0,
           names = col_names)
df

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
................................................
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

32560 rows × 15 columns

Visualización básica de DataFrames

df.head(): primeras filas

python
# df.head() nos muestra, por defecto, las primeras 5 filas del dataframe
df.head()

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
python
# Si quieremos ver más o menos de 5 filas, como por ejemplo 2, podemos especificarlo de la siguiente manera:
df.head(n=2)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K

df.tail(): últimas filas

Funciona de forma idéntica a df.head(), pero mostrando las últimas filas en lugar de las primeras:

python
df.tail()

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K
python
df.tail(n=2)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

df.sample(): filas aleatorias

En este caso, por defecto solo se muestra una fila aleatoria, aunque también se puede especificar cualquier otro número para mostrar más filas.

python
df.sample()

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
194124Local-gov249101HS-grad9DivorcedProtective-servUnmarriedBlackFemale0040United-States<=50K
python
df.sample(n = 5)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
3203752Private294991Bachelors13Married-civ-spouseProf-specialtyHusbandWhiteMale0040United-States>50K
350737Private265038Some-college10Married-civ-spouseTransport-movingHusbandWhiteMale0050United-States<=50K
80764Private270333Bachelors13Married-civ-spouseProf-specialtyHusbandWhiteMale0040United-States>50K
1724925Private4566187th-8th4Never-marriedMachine-op-inspctUnmarriedWhiteMale0040El-Salvador<=50K
1777054Private93605HS-grad9Married-civ-spouseSalesHusbandWhiteMale0184840United-States>50K
python
df.sample(frac= 0.1)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
2220438Private201454Some-college10DivorcedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
52237Local-gov186035Some-college10Married-civ-spouseTech-supportHusbandWhiteMale0045United-States>50K
2217522Private137591Some-college10Never-marriedSalesOwn-childWhiteMale0035United-States<=50K
1342153Private366957Bachelors13Married-civ-spouseExec-managerialHusbandAsian-Pac-IslanderMale99999050India>50K
2874141Private11872112th8DivorcedAdm-clericalNot-in-familyAmer-Indian-EskimoMale0040United-States<=50K
................................................
2617159Self-emp-inc141326Assoc-voc11DivorcedProf-specialtyNot-in-familyWhiteMale0050United-States>50K
1961346Private194431HS-grad9Never-marriedTech-supportOther-relativeWhiteMale0040United-States<=50K
1731376?84755Some-college10Widowed?UnmarriedWhiteFemale0040United-States<=50K
1389624Private193920Masters14Never-marriedPriv-house-servNot-in-familyWhiteFemale0045?<=50K
2090877Self-emp-not-inc71676Some-college10WidowedAdm-clericalNot-in-familyWhiteFemale019441United-States<=50K

3256 rows × 15 columns

python
df.sample(n = 5, random_state=10)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
1135841Private134130Bachelors13Married-civ-spouseSalesHusbandWhiteMale0050United-States>50K
1085938Private107302Some-college10Married-civ-spouseSalesHusbandWhiteMale0060United-States>50K
3094824Private136687HS-grad9SeparatedMachine-op-inspctUnmarriedOtherFemale0040United-States<=50K
2981135Self-emp-inc187053Bachelors13SeparatedProf-specialtyNot-in-familyWhiteFemale0050United-States<=50K
1840869?254834Bachelors13Married-civ-spouse?HusbandWhiteMale10605010United-States>50K
python
df.sample(n = 5, random_state=10)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
1135841Private134130Bachelors13Married-civ-spouseSalesHusbandWhiteMale0050United-States>50K
1085938Private107302Some-college10Married-civ-spouseSalesHusbandWhiteMale0060United-States>50K
3094824Private136687HS-grad9SeparatedMachine-op-inspctUnmarriedOtherFemale0040United-States<=50K
2981135Self-emp-inc187053Bachelors13SeparatedProf-specialtyNot-in-familyWhiteFemale0050United-States<=50K
1840869?254834Bachelors13Married-civ-spouse?HusbandWhiteMale10605010United-States>50K

df.index: índice

En el DataFrame df, no especificamos ningún índice especial, así que se creó uno por defecto a partir de una secuencia de números enteros. Puedes verlo de esta manera:

python
df.index
RangeIndex(start=0, stop=32560, step=1)
python
df.index.values
array([    0,     1,     2, ..., 32557, 32558, 32559], dtype=int64)

En efecto, el índice que pandas ha creado es un rango de números enteros consecutivos, desde 0 (incluido) hasta 23561 (sin incluir).

df.columns: nombres de las columnas

python
df.columns
Index(['age', 'workclass', 'fnlwgt', 'education', 'education-num',
       'marital-status', 'occupation', 'relationship', 'race', 'sex',
       'capital-gain', 'capital-loss', 'hours-per-week', 'native-country',
       'income'],
      dtype='object')

Selección de filas y columnas (indexación)

Casi todas las operaciones de procesamiento de datos implican seleccionar las columnas concretas sobre las que se desea trabajar, lo que se puede hacer de varias formas, ya sea con los métodos nativos del lenguaje Python o con los métodos de la librería pandas.

python
file_path = "C:/Users/user/Desktop/adult.data"

col_names = ["age", 
            "workclass",
            "fnlwgt", 
            "education",
            "education-num",
            "marital-status",
            "occupation",
            "relationship",
            "race",
            "sex",
            "capital-gain",
            "capital-loss",
            "hours-per-week",
            "native-country",
            "income"]


adult_data = pd.read_csv(filepath_or_buffer = file_path,
           header = 0,
           names = col_names)
adult_data

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
................................................
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

32560 rows × 15 columns

Métodos nativos del lenguaje Python

Selección de filas

python
adult_data[0:4]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
python
adult_data[0:-2]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
................................................
3255353Private321865Masters14Married-civ-spouseExec-managerialHusbandWhiteMale0040United-States>50K
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K

32558 rows × 15 columns

python
adult_data[:3]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K

Selección de columnas

El lenguaje Python, ya de por sí, proporciona algunas maneras de indexar datos, como por ejemplo accediendo a una propiedad de un objeto como si de un atributo se tratara. Si quisiéramos acceder a la columna occupation del DataFrame anterior, podríamos hacerlo de la siguiente manera:

python
adult_data.occupation
0           Exec-managerial
1         Handlers-cleaners
2         Handlers-cleaners
3            Prof-specialty
4           Exec-managerial
                ...        
32555          Tech-support
32556     Machine-op-inspct
32557          Adm-clerical
32558          Adm-clerical
32559       Exec-managerial
Name: occupation, Length: 32560, dtype: object

Por otro lado, de forma similar a como hacemos para acceder a los valores de un diccionario de Python, también podemos acceder a los valores de una columna usando el operador []:

python
adult_data["occupation"]
0           Exec-managerial
1         Handlers-cleaners
2         Handlers-cleaners
3            Prof-specialty
4           Exec-managerial
                ...        
32555          Tech-support
32556     Machine-op-inspct
32557          Adm-clerical
32558          Adm-clerical
32559       Exec-managerial
Name: occupation, Length: 32560, dtype: object

Por tanto, los dos métodos anteriores permiten seleccionar una Serie concreta de un DataFrame. Ambos son igual de válidos, pero el operador de indexación [] tiene la gran ventaja de que permite nombres de columnas con caracteres especiales. Es decir, si queremos acceder a la columna hours-per-week:

  • df.hours-per-week no funcionará (no sabe tratar los guiones, ni tampoco funcionaría si el nombre tuviera espacios en blanco).
  • df[“hours-per-week”] sí funcionará.

Comprobémoslo:

python
adult_data.hours-per-week
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-3516cc3a2087> in <module>
----> 1 df.hours-per-week

~\anaconda3\envs\python-385\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   5134             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5135                 return self[name]
-> 5136             return object.__getattribute__(self, name)
   5137 
   5138     def __setattr__(self, name: str, value) -> None:

AttributeError: 'DataFrame' object has no attribute 'hours'
python
adult_data["hours-per-week"]
0        13
1        40
2        40
3        40
4        40
         ..
32555    38
32556    40
32557    40
32558    20
32559    40
Name: hours-per-week, Length: 32560, dtype: int64

Si no solo queremos seleccionar una columna, sino un valor concreto dentro de esa columna, podemos acceder a él de la siguiente manera:

python
adult_data["hours-per-week"][32555]
38

Donde [1] indica la posición del valor dentro de la columna.

Métodos de pandas

Los métodos nativos de Python anteriores funcionan muy bien, pero la librería pandas tiene también sus propios métodos para seleccionar y acceder a columnas y valores concretos de un objeto.

python
adult_data

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
................................................
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

32560 rows × 15 columns

iloc: selección basada en posición

El primer método de pandas permite hacer selecciones basadas en un índice, es decir, en la posición numérica de un dato detro del conjunto de datos. Su sintaxis es data.iloc[filas,columnas], donde filas y columnas hacen referencia a la posición de las filas y columnas que se desea seleccionar.

Selección de filas

Tanto loc como iloc requieren indicar primero la fila y, en segundo lugar, la columna. Es decir, funcionan justo al revés que los métodos nativos de Python para indexación. Si no se especifican columnas concretas, se seleccionan todas las columnas de la fila. Por ejemplo, para seleccionar la primera fila del DataFrame con el que estamos trabajando:

python
adult_data.iloc[0]
age                                50
workclass                         NaN
fnlwgt                          83311
education                   Bachelors
education-num                      13
marital-status     Married-civ-spouse
occupation            Exec-managerial
relationship                  Husband
race                            White
sex                              Male
capital-gain                        0
capital-loss                        0
hours-per-week                     13
native-country          United-States
income                          <=50K
Name: 0, dtype: object
python
adult_data.iloc[32555]
age                                27
workclass                     Private
fnlwgt                         257302
education                  Assoc-acdm
education-num                      12
marital-status     Married-civ-spouse
occupation               Tech-support
relationship                     Wife
race                            White
sex                            Female
capital-gain                        0
capital-loss                        0
hours-per-week                     38
native-country          United-States
income                          <=50K
Name: 32555, dtype: object
python
adult_data[0:3]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
python
adult_data.iloc[0:3]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K

Si se quiere seleccionar alguna fila empezando a contar desde el final del DataFrame, pueden usarse valores negativos:

python
adult_data.iloc[-1]
age                                52
workclass                Self-emp-inc
fnlwgt                         287927
education                     HS-grad
education-num                       9
marital-status     Married-civ-spouse
occupation            Exec-managerial
relationship                     Wife
race                            White
sex                            Female
capital-gain                    15024
capital-loss                        0
hours-per-week                     40
native-country          United-States
income                           >50K
Name: 32559, dtype: object
python
# Penúltima fila
adult_data.iloc[-2]
age                           22
workclass                Private
fnlwgt                    201490
education                HS-grad
education-num                  9
marital-status     Never-married
occupation          Adm-clerical
relationship           Own-child
race                       White
sex                         Male
capital-gain                   0
capital-loss                   0
hours-per-week                20
native-country     United-States
income                     <=50K
Name: 32558, dtype: object

Selección de columnas

Para seleccionar una columna completa con iloc, hacemos lo siguiente:

python
# Primera columna
adult_data.iloc[:, 0]
0        50
1        38
2        53
3        28
4        37
         ..
32555    27
32556    40
32557    58
32558    22
32559    52
Name: age, Length: 32560, dtype: int64
python
# Última columna
adult_data.iloc[:, -1]
0         <=50K
1         <=50K
2         <=50K
3         <=50K
4         <=50K
          ...  
32555     <=50K
32556      >50K
32557     <=50K
32558     <=50K
32559      >50K
Name: income, Length: 32560, dtype: object

Selección de filas y columnas

El operador “:”, por sí solo, ordena que se recojan “todos los valores”. Sin embargo, puede combinarse con otros selectores para referirse a un rango limitado de valores:

python
# Desde la primera fila (incluida) hasta la de índice 3 (sin incluir)
adult_data.iloc[0:3]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
python
# Desde la primera fila (incluida) hasta la fila de índice 3 (sin incluir), pertenecientes a la primera columna
adult_data.iloc[0:3, 0]
0    50
1    38
2    53
Name: age, dtype: int64
python
# Todas las filas de las columnas con posiciones 0-3 (la 3 sin incluir)
adult_data.iloc[:, 0:3]

ageworkclassfnlwgt
050NaN83311
138Private215646
253Private234721
328Private338409
437Private284582
............
3255527Private257302
3255640Private154374
3255758Private151910
3255822Private201490
3255952Self-emp-inc287927

32560 rows × 3 columns

python
# Desde la fila 1 (incluida) hasta la 3 (sin incluir), pertenecientes a la primera columna
adult_data.iloc[1:3, 0]
1    38
2    53
Name: age, dtype: int64
python
# Primera, segunda y tercera fila
adult_data.iloc[[0, 1, 2]]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
python
# Primera, segunda y tercera fila
adult_data.iloc[[0, 1, 2], :]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
python
# Las filas 0, 1 y 2 de la primera columna
adult_data.iloc[[0,1,2], 0]
0    50
1    38
2    53
Name: age, dtype: int64
python
# Todas las filas de las columnas 0, 2 y 4
adult_data.iloc[:, [0, 2, 4]]

agefnlwgteducation-num
0508331113
1382156469
2532347217
32833840913
43728458214
............
325552725730212
32556401543749
32557581519109
32558222014909
32559522879279

32560 rows × 3 columns

También es posible utilizar números negativos en la selección, lo que implica que se empezará a contar desde el final de los valores:

python
# Fila 5 de un dataset, empezando a contar desde el final
adult_data.iloc[-5]
age                                27
workclass                     Private
fnlwgt                         257302
education                  Assoc-acdm
education-num                      12
marital-status     Married-civ-spouse
occupation               Tech-support
relationship                     Wife
race                            White
sex                            Female
capital-gain                        0
capital-loss                        0
hours-per-week                     38
native-country          United-States
income                          <=50K
Name: 32555, dtype: object
python
# Fila 5 de un dataset, empezando a contar desde el final
adult_data.iloc[-5, :]
age                                27
workclass                     Private
fnlwgt                         257302
education                  Assoc-acdm
education-num                      12
marital-status     Married-civ-spouse
occupation               Tech-support
relationship                     Wife
race                            White
sex                            Female
capital-gain                        0
capital-loss                        0
hours-per-week                     38
native-country          United-States
income                          <=50K
Name: 32555, dtype: object

loc: selección basada en etiquetas

python
df = pd.DataFrame({"Columna1": 10,
                  "Columna2": 20,
                  "Columna3": 30},
                 index = ["Fila1", "Fila2", "Fila3"])
df

Columna1Columna2Columna3
Fila1102030
Fila2102030
Fila3102030

El segundo enfoque de pandas consiste en la selección basada en las etiquetas de los valores, en lugar de su posición.

python
# Primer valor de la columna "education-num"
df.loc["Fila1", "Columna1"]
10
python
# Todas las filas de las columnas "education", "marital-status" y "relationship"
adult_data.loc[:, ["education", "marital-status", "relationship"]]

educationmarital-statusrelationship
0BachelorsMarried-civ-spouseHusband
1HS-gradDivorcedNot-in-family
211thMarried-civ-spouseHusband
3BachelorsMarried-civ-spouseWife
4MastersMarried-civ-spouseWife
............
32555Assoc-acdmMarried-civ-spouseWife
32556HS-gradMarried-civ-spouseHusband
32557HS-gradWidowedUnmarried
32558HS-gradNever-marriedOwn-child
32559HS-gradMarried-civ-spouseWife

32560 rows × 3 columns

python
# Primer valor de la columna "education"
adult_data.loc[0, "education"]
' Bachelors'

Como hemos visto, el método iloc icluye el primer elemento del rango pero excluye el último, es decir, 0:10 seleccionará los valores del 0 al 9, ambos incluidos. El método loc, sin embargo, incluye tanto el primer elemento del rango como el último. Por tanto, 0:10 seleccionará los valores del 0 al 10, ambos incluidos.

python
adult_data.loc[0:10, ["education", "marital-status", "relationship"]]

educationmarital-statusrelationship
0BachelorsMarried-civ-spouseHusband
1HS-gradDivorcedNot-in-family
211thMarried-civ-spouseHusband
3BachelorsMarried-civ-spouseWife
4MastersMarried-civ-spouseWife
59thMarried-spouse-absentNot-in-family
6HS-gradMarried-civ-spouseHusband
7MastersNever-marriedNot-in-family
8BachelorsMarried-civ-spouseHusband
9Some-collegeMarried-civ-spouseHusband
10BachelorsMarried-civ-spouseHusband
python
adult_data.iloc[0:10, :]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
549Private1601879th5Married-spouse-absentOther-serviceNot-in-familyBlackFemale0016Jamaica<=50K
652Self-emp-not-inc209642HS-grad9Married-civ-spouseExec-managerialHusbandWhiteMale0045United-States>50K
731Private45781Masters14Never-marriedProf-specialtyNot-in-familyWhiteFemale14084050United-States>50K
842Private159449Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale5178040United-States>50K
937Private280464Some-college10Married-civ-spouseExec-managerialHusbandBlackMale0080United-States>50K

Selección basada en condiciones

El método loc de pandas no solo permite seleccionar filas y columnas por etiquetas, sino también en base a condiciones.

Imagina que estamos interesados en conocer los adultos del dataset que nunca se han casado y que, además trabajan 40 horas o más a la semana. En primer lugar, podríamos descubrir cuáles no se han casado nunca de la siguiente manera:

python
adult_data.head(20)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
549Private1601879th5Married-spouse-absentOther-serviceNot-in-familyBlackFemale0016Jamaica<=50K
652Self-emp-not-inc209642HS-grad9Married-civ-spouseExec-managerialHusbandWhiteMale0045United-States>50K
731Private45781Masters14Never-marriedProf-specialtyNot-in-familyWhiteFemale14084050United-States>50K
842Private159449Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale5178040United-States>50K
937Private280464Some-college10Married-civ-spouseExec-managerialHusbandBlackMale0080United-States>50K
1030State-gov141297Bachelors13Married-civ-spouseProf-specialtyHusbandAsian-Pac-IslanderMale0040India>50K
1123Private122272Bachelors13Never-marriedAdm-clericalOwn-childWhiteFemale0030United-States<=50K
1232Private205019Assoc-acdm12Never-marriedSalesNot-in-familyBlackMale0050United-States<=50K
1340Private121772Assoc-voc11Married-civ-spouseCraft-repairHusbandAsian-Pac-IslanderMale0040?>50K
1434Private2454877th-8th4Married-civ-spouseTransport-movingHusbandAmer-Indian-EskimoMale0045Mexico<=50K
1525Self-emp-not-inc176756HS-grad9Never-marriedFarming-fishingOwn-childWhiteMale0035United-States<=50K
1632Private186824HS-grad9Never-marriedMachine-op-inspctUnmarriedWhiteMale0040United-States<=50K
1738Private2888711th7Married-civ-spouseSalesHusbandWhiteMale0050United-States<=50K
1843Self-emp-not-inc292175Masters14DivorcedExec-managerialUnmarriedWhiteFemale0045United-States>50K
1940Private193524Doctorate16Married-civ-spouseProf-specialtyHusbandWhiteMale0060United-States>50K
python
adult_data.loc[:, "marital-status"] == "Never-married"
0        False
1        False
2        False
3        False
4        False
         ...  
32555    False
32556    False
32557    False
32558    False
32559    False
Name: marital-status, Length: 32560, dtype: bool

Esta operación produce una Serie con valores True/False en función de si la propiedad “marital-status” coincide con “Never-married” o no. Si introducimos esta operación en un loc, solo estaremos seleccionando los datos que cumplan la condición:

python
adult_data.loc[adult_data.loc[:, "marital-status"] == " Never-married"]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
731Private45781Masters14Never-marriedProf-specialtyNot-in-familyWhiteFemale14084050United-States>50K
1123Private122272Bachelors13Never-marriedAdm-clericalOwn-childWhiteFemale0030United-States<=50K
1232Private205019Assoc-acdm12Never-marriedSalesNot-in-familyBlackMale0050United-States<=50K
1525Self-emp-not-inc176756HS-grad9Never-marriedFarming-fishingOwn-childWhiteMale0035United-States<=50K
1632Private186824HS-grad9Never-marriedMachine-op-inspctUnmarriedWhiteMale0040United-States<=50K
................................................
3253630Private345898HS-grad9Never-marriedCraft-repairNot-in-familyBlackMale0046United-States<=50K
3254765Self-emp-not-inc99359Prof-school15Never-marriedProf-specialtyNot-in-familyWhiteMale1086060United-States<=50K
3255232Private116138Masters14Never-marriedTech-supportNot-in-familyAsian-Pac-IslanderMale0011Taiwan<=50K
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K

10682 rows × 15 columns

python
# La celda anterior devuelve un dataframe vacío, ¿por qué?
# Si aplicamos un unique(), vemos que ' Never-married' tiene un espacio en primera posición
python
adult_data.loc[:, "marital-status"].unique()
array([' Married-civ-spouse', ' Divorced', ' Married-spouse-absent',
       ' Never-married', ' Separated', ' Married-AF-spouse', ' Widowed'],
      dtype=object)

Hasta aquí, solo hemos seleccionado los adultos que no han estado casados, pero no aquellos que trabajan 40h o más a la semana.

python
adult_data.loc[(adult_data.loc[:, "marital-status"] == " Never-married") &
              (adult_data.loc[:, "hours-per-week"] >= 40)]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
731Private45781Masters14Never-marriedProf-specialtyNot-in-familyWhiteFemale14084050United-States>50K
1232Private205019Assoc-acdm12Never-marriedSalesNot-in-familyBlackMale0050United-States<=50K
1632Private186824HS-grad9Never-marriedMachine-op-inspctUnmarriedWhiteMale0040United-States<=50K
2519Private168294HS-grad9Never-marriedCraft-repairOwn-childWhiteMale0040United-States<=50K
2923Local-gov190709Assoc-acdm12Never-marriedProtective-servNot-in-familyWhiteMale0052United-States<=50K
................................................
3253030?33811Bachelors13Never-married?Not-in-familyAsian-Pac-IslanderFemale0099United-States<=50K
3253534Private160216Bachelors13Never-marriedExec-managerialNot-in-familyWhiteFemale0055United-States>50K
3253630Private345898HS-grad9Never-marriedCraft-repairNot-in-familyBlackMale0046United-States<=50K
3254765Self-emp-not-inc99359Prof-school15Never-marriedProf-specialtyNot-in-familyWhiteMale1086060United-States<=50K
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K

6872 rows × 15 columns

Imagina ahora que queremos conocer los adultos que no han estado casados o que trabajan 40h o más a la semana.

python
adult_data.loc[(adult_data.loc[:, "marital-status"] == " Never-married") |
              (adult_data.loc[:, "hours-per-week"] >= 40)]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
652Self-emp-not-inc209642HS-grad9Married-civ-spouseExec-managerialHusbandWhiteMale0045United-States>50K
................................................
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

28607 rows × 15 columns

python
adult_data.loc[:, "marital-status"]
0         Married-civ-spouse
1                   Divorced
2         Married-civ-spouse
3         Married-civ-spouse
4         Married-civ-spouse
                ...         
32555     Married-civ-spouse
32556     Married-civ-spouse
32557                Widowed
32558          Never-married
32559     Married-civ-spouse
Name: marital-status, Length: 32560, dtype: object
python
adult_data["marital-status"]
0         Married-civ-spouse
1                   Divorced
2         Married-civ-spouse
3         Married-civ-spouse
4         Married-civ-spouse
                ...         
32555     Married-civ-spouse
32556     Married-civ-spouse
32557                Widowed
32558          Never-married
32559     Married-civ-spouse
Name: marital-status, Length: 32560, dtype: object
python
adult_data.loc[(adult_data.loc[:, "marital-status"] == " Never-married") |
              (adult_data.loc[:, "hours-per-week"] >= 40)]
python
adult_data.loc[(adult_data["marital-status"] == " Never-married") |
              (adult_data["hours-per-week"] >= 40)]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
652Self-emp-not-inc209642HS-grad9Married-civ-spouseExec-managerialHusbandWhiteMale0045United-States>50K
................................................
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

28607 rows × 15 columns

python
# Métodos nativos de Python
adult_data[(adult_data["marital-status"] == " Never-married") |
           (adult_data["hours-per-week"] >= 40)]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
652Self-emp-not-inc209642HS-grad9Married-civ-spouseExec-managerialHusbandWhiteMale0045United-States>50K
................................................
3255422Private310152Some-college10Never-marriedProtective-servNot-in-familyWhiteMale0040United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

28607 rows × 15 columns

Pandas incluye también unos cuantos selectores específicos muy útiles, entre los cuales destaca isin. Este operador permite seleccionar los datos cuyos valores están dentro de una lista especificada. Por ejemplo, podríamos seleccionar los adultos que tiene nivel educativo “Bachelors” (como una licenciatura) o “Masters”:

python
value_list = [" Bachelors", " Masters"]
value_list
[' Bachelors', ' Masters']
python
# Antes de nada, vamos a asegurarnos de cómo están escritas ambas categorías en los datos
python
adult_data.loc[:, "education"].isin(value_list)
0         True
1        False
2        False
3         True
4         True
         ...  
32555    False
32556    False
32557    False
32558    False
32559    False
Name: education, Length: 32560, dtype: bool
python
adult_data.loc[adult_data.loc[:, "education"].isin(value_list)]

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
731Private45781Masters14Never-marriedProf-specialtyNot-in-familyWhiteFemale14084050United-States>50K
842Private159449Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale5178040United-States>50K
................................................
3253534Private160216Bachelors13Never-marriedExec-managerialNot-in-familyWhiteFemale0055United-States>50K
3253738Private139180Bachelors13DivorcedProf-specialtyUnmarriedBlackFemale15020045United-States>50K
3254331Private199655Masters14DivorcedOther-serviceNot-in-familyOtherFemale0030United-States<=50K
3255232Private116138Masters14Never-marriedTech-supportNot-in-familyAsian-Pac-IslanderMale0011Taiwan<=50K
3255353Private321865Masters14Married-civ-spouseExec-managerialHusbandWhiteMale0040United-States>50K

7077 rows × 15 columns

python
adult_data.loc[:, "education"].unique()
array([' Bachelors', ' HS-grad', ' 11th', ' Masters', ' 9th',
       ' Some-college', ' Assoc-acdm', ' Assoc-voc', ' 7th-8th',
       ' Doctorate', ' Prof-school', ' 5th-6th', ' 10th', ' 1st-4th',
       ' Preschool', ' 12th'], dtype=object)

Asignación de datos

python
adult_data.head(3)

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K

Asignar datos a un DataFrame es muy sencillo, ya sea un valor constante o un conjunto de valores:

python
adult_data.loc[:, "education-num"] = "valor_constante"
python
adult_data.occupation = "occupation"
python
adult_data["marital-status"] = "estado"
python
adult_data["relationship"] = range(len(adult_data))
python
# adult_data["relationship"] = [10, 11, -5 , 3 ...]
python
adult_data["marital-status"] = adult_data["occupation"]
python
adult_data.loc[adult_data["education"] == " Bachelors", "marital-status"] = "X"
python
adult_data.loc[adult_data["education"] == " HS-grad", ["marital-status", "race"]] = "Y", "Z"
python
adult_data

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelorsvalor_constanteXoccupation0WhiteMale0013United-States<=50K
138Private215646HS-gradvalor_constanteYoccupation1ZMale0040United-States<=50K
253Private23472111thvalor_constanteoccupationoccupation2BlackMale0040United-States<=50K
328Private338409Bachelorsvalor_constanteXoccupation3BlackFemale0040Cuba<=50K
437Private284582Mastersvalor_constanteoccupationoccupation4WhiteFemale0040United-States<=50K
................................................
3255527Private257302Assoc-acdmvalor_constanteoccupationoccupation32555WhiteFemale0038United-States<=50K
3255640Private154374HS-gradvalor_constanteYoccupation32556ZMale0040United-States>50K
3255758Private151910HS-gradvalor_constanteYoccupation32557ZFemale0040United-States<=50K
3255822Private201490HS-gradvalor_constanteYoccupation32558ZMale0020United-States<=50K
3255952Self-emp-inc287927HS-gradvalor_constanteYoccupation32559ZFemale15024040United-States>50K

32560 rows × 15 columns

Como hemos visto, si la columna existe, se sobreescriben sus valores con el que le hayamos asignado. Si no existe, se crea una nueva columna:

python
adult_data["new_column"] = "New"
python
adult_data.loc[adult_data["sex"] == " Male", "nueva_columna"] = "M"
python
adult_data.loc[adult_data["sex"] != " Male", "nueva_columna2"] = "F"
python
adult_data["sex"].unique()
array([' Male', ' Female'], dtype=object)
python
adult_data

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincomenew_columnnueva_columnanueva_columna2
050NaN83311Bachelorsvalor_constanteXoccupation0WhiteMale0013United-States<=50KNewMNaN
138Private215646HS-gradvalor_constanteYoccupation1ZMale0040United-States<=50KNewMNaN
253Private23472111thvalor_constanteoccupationoccupation2BlackMale0040United-States<=50KNewMNaN
328Private338409Bachelorsvalor_constanteXoccupation3BlackFemale0040Cuba<=50KNewNaNF
437Private284582Mastersvalor_constanteoccupationoccupation4WhiteFemale0040United-States<=50KNewNaNF
.........................................................
3255527Private257302Assoc-acdmvalor_constanteoccupationoccupation32555WhiteFemale0038United-States<=50KNewNaNF
3255640Private154374HS-gradvalor_constanteYoccupation32556ZMale0040United-States>50KNewMNaN
3255758Private151910HS-gradvalor_constanteYoccupation32557ZFemale0040United-States<=50KNewNaNF
3255822Private201490HS-gradvalor_constanteYoccupation32558ZMale0020United-States<=50KNewMNaN
3255952Self-emp-inc287927HS-gradvalor_constanteYoccupation32559ZFemale15024040United-States>50KNewNaNF

32560 rows × 18 columns

Manipulación del índice

Existe un método de pandas, set_index(), que permite establecer como índice el que nosotros queramos, como por ejemplo una columna:

python
adult_data

ageworkclassfnlwgteducationeducation-nummarital-statusoccupationrelationshipracesexcapital-gaincapital-losshours-per-weeknative-countryincome
050NaN83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
138Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
253Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
328Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K
437Private284582Masters14Married-civ-spouseExec-managerialWifeWhiteFemale0040United-States<=50K
................................................
3255527Private257302Assoc-acdm12Married-civ-spouseTech-supportWifeWhiteFemale0038United-States<=50K
3255640Private154374HS-grad9Married-civ-spouseMachine-op-inspctHusbandWhiteMale0040United-States>50K
3255758Private151910HS-grad9WidowedAdm-clericalUnmarriedWhiteFemale0040United-States<=50K
3255822Private201490HS-grad9Never-marriedAdm-clericalOwn-childWhiteMale0020United-States<=50K
3255952Self-emp-inc287927HS-grad9Married-civ-spouseExec-managerialWifeWhiteFemale15024040United-States>50K

32560 rows × 15 columns

python
df = pd.DataFrame({"Columna1": [10, 20, 30],
                  "Columna2": [40, 50, 60],
                  "Columna3": 30},
                 index = ["Fila1", "Fila2", "Fila3"])
df

Columna1Columna2Columna3
Fila1104030
Fila2205030
Fila3306030
python
nuevo_indice = ["Id1", "Id2", "Id3"]
nuevo_indice
['Id1', 'Id2', 'Id3']
python
df.set_index(nuevo_indice)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-d4ffeb50a63e> in <module>
----> 1 df.set_index(nuevo_indice)

~\anaconda3\envs\python-385\lib\site-packages\pandas\core\frame.py in set_index(self, keys, drop, append, inplace, verify_integrity)
   4548 
   4549         if missing:
-> 4550             raise KeyError(f"None of {missing} are in the columns")
   4551 
   4552         if inplace:

KeyError: "None of ['Id1', 'Id2', 'Id3'] are in the columns"
python
nuevo_indice_arr = np.array(["Id1", "Id2", "Id3"])
nuevo_indice_arr
array(['Id1', 'Id2', 'Id3'], dtype='<U3')
python
df.set_index(nuevo_indice_arr)

Columna1Columna2Columna3
Id1104030
Id2205030
Id3306030
python
df

Columna1Columna2Columna3
Fila1104030
Fila2205030
Fila3306030
python
# Primera opción para conservar el resultado
df.set_index(nuevo_indice_arr, inplace=True)
python
df

Columna1Columna2Columna3
Id1104030
Id2205030
Id3306030
python
# Primera opción para conservar el resultado
df = df.set_index(np.array(["i1", "i2", "i3"]), inplace=False)
python
df

Columna1Columna2Columna3
i1104030
i2205030
i3306030
python
df.set_index("Columna3", inplace=True)
python
df

Columna1Columna2
Columna3
301040
302050
303060
python
df["Columna4"] = [40, 40, 40]
df

Columna1Columna2Columna4
Columna3
30104040
30205040
30306040
python
df.set_index("Columna4", inplace=True, verify_integrity=True)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-93462f2e4f72> in <module>
----> 1 df.set_index("Columna4", inplace=True, verify_integrity=True)

~\anaconda3\envs\python-385\lib\site-packages\pandas\core\frame.py in set_index(self, keys, drop, append, inplace, verify_integrity)
   4600         if verify_integrity and not index.is_unique:
   4601             duplicates = index[index.duplicated()].unique()
-> 4602             raise ValueError(f"Index has duplicate keys: {duplicates}")
   4603 
   4604         # use set to handle duplicate column names gracefully in case of drop

ValueError: Index has duplicate keys: Int64Index([40], dtype='int64', name='Columna4')
python
df.index
Int64Index([30, 30, 30], dtype='int64', name='Columna3')
python
df.index.values
array([30, 30, 30], dtype=int64)
python
df.index.to_list()
[30, 30, 30]
comments powered by Disqus