Concatenacióny fusión de dataframes (concat() y append()) — 11:16 min

  • 11:16 min | Última modificación: Octubre 6, 2021

La función concat() permite la concatenación de dataframes y series a lo largo de un eje.

[1]:
import pandas as pd

pd.set_option("display.notebook_repr_html", False)
diagram-concat

## Concatenación sin campos clave

Creación del dataframe 1

[2]:
%%writefile /tmp/dataset_1.csv
name,location
Omar Y. Fletcher,6833 Mollis. Rd.
Buffy W. Vincent,"P.O. Box 345, 8390 Ante Avenue"
Mira N. Franklin,"P.O. Box 445, 323 Cursus Rd."
Ferris Q. Le,Ap #791-3809 Eu Street
Michael I. Gray,6715 Diam. Rd.
Alan T. Mullins,512-3640 Nisl Rd.
Morgan W. Zamora,416-6030 Vivamus Road
Lilah O. Morrison,3859 Mauris Ave
Chantale Z. Kelley,3433 Arcu. Rd.
Randall Q. Mcclure,Ap #584-7470 Nibh. Ave
Writing /tmp/dataset_1.csv

Creación del dataframe 2

[3]:
%%writefile /tmp/dataset_2.csv
name,location
Baker C. Hurst,249-6250 Velit. Rd.
Bevis W. Molina,"P.O. Box 935, 1521 At, St."
Martina B. Schroeder,689-7600 Mi St.
Kylie G. Bailey,1430 Diam. Road
Steel K. Glover,"757-681 Et, Av."
Lucas M. Suarez,699-9329 Magna Rd.
Anastasia Q. Mccray,"P.O. Box 780, 4487 Lobortis, St."
Germaine Q. Henson,589-4921 Duis Ave
Wilma U. Mcfadden,6917 Dictum Rd.
Merritt Q. Martinez,"P.O. Box 469, 7833 Euismod Av."
Writing /tmp/dataset_2.csv

Creación del dataframe 3

[5]:
%%writefile /tmp/bonus.csv
bonus
279
138
227
160
267
231
169
263
233
292
208
247
240
161
248
216
291
215
463
790
Writing /tmp/bonus.csv

Concatenación de los dataframes 1 y 2

[6]:
#
# Carga del dataset 1
#
dataset_1 = pd.read_csv("/tmp/dataset_1.csv")

#
# Carga del dataset 2
#
dataset_2 = pd.read_csv("/tmp/dataset_2.csv")

#
# Concat con valores por defecto
#
datasets_12 = pd.concat(
    objs=[
        dataset_1,
        dataset_2,
    ],
    #
    # axis= 0/index, 1/columns
    #
    axis=0,
    #
    # join={'inner', 'outer'}
    #
    join="outer",
    #
    # ignore_index=bool
    #
    ignore_index=False,
    #
    # sort=bool
    # Ordena el otro eje si el join es 'outer'.
    # Se ignora cuando es 'inner'
    #
    sort=False,
)

#
# Observe que hay numeros de fila repetidos (index)
# ignore_index=False
#
datasets_12
[6]:
                   name                          location
0      Omar Y. Fletcher                  6833 Mollis. Rd.
1      Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue
2      Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.
3          Ferris Q. Le            Ap #791-3809 Eu Street
4       Michael I. Gray                    6715 Diam. Rd.
5       Alan T. Mullins                 512-3640 Nisl Rd.
6      Morgan W. Zamora             416-6030 Vivamus Road
7     Lilah O. Morrison                   3859 Mauris Ave
8    Chantale Z. Kelley                    3433 Arcu. Rd.
9    Randall Q. Mcclure            Ap #584-7470 Nibh. Ave
0        Baker C. Hurst               249-6250 Velit. Rd.
1       Bevis W. Molina        P.O. Box 935, 1521 At, St.
2  Martina B. Schroeder                   689-7600 Mi St.
3       Kylie G. Bailey                   1430 Diam. Road
4       Steel K. Glover                   757-681 Et, Av.
5       Lucas M. Suarez                699-9329 Magna Rd.
6   Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.
7    Germaine Q. Henson                 589-4921 Duis Ave
8     Wilma U. Mcfadden                   6917 Dictum Rd.
9   Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.
[7]:
#
# Se ingnora el índice
#
datasets_12 = pd.concat(
    objs=[
        dataset_1,
        dataset_2,
    ],
    ignore_index=True,
)
datasets_12
[7]:
                    name                          location
0       Omar Y. Fletcher                  6833 Mollis. Rd.
1       Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue
2       Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.
3           Ferris Q. Le            Ap #791-3809 Eu Street
4        Michael I. Gray                    6715 Diam. Rd.
5        Alan T. Mullins                 512-3640 Nisl Rd.
6       Morgan W. Zamora             416-6030 Vivamus Road
7      Lilah O. Morrison                   3859 Mauris Ave
8     Chantale Z. Kelley                    3433 Arcu. Rd.
9     Randall Q. Mcclure            Ap #584-7470 Nibh. Ave
10        Baker C. Hurst               249-6250 Velit. Rd.
11       Bevis W. Molina        P.O. Box 935, 1521 At, St.
12  Martina B. Schroeder                   689-7600 Mi St.
13       Kylie G. Bailey                   1430 Diam. Road
14       Steel K. Glover                   757-681 Et, Av.
15       Lucas M. Suarez                699-9329 Magna Rd.
16   Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.
17    Germaine Q. Henson                 589-4921 Duis Ave
18     Wilma U. Mcfadden                   6917 Dictum Rd.
19   Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.
[8]:
bonus = pd.read_csv("/tmp/bonus.csv")

#
# Se requiere que los datasets tengan los mismos
# indices en las filas.
#
dataset_full = pd.concat(
    [
        datasets_12,
        bonus,
    ],
    axis=1,
)
dataset_full
[8]:
                    name                          location  bonus
0       Omar Y. Fletcher                  6833 Mollis. Rd.    279
1       Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue    138
2       Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.    227
3           Ferris Q. Le            Ap #791-3809 Eu Street    160
4        Michael I. Gray                    6715 Diam. Rd.    267
5        Alan T. Mullins                 512-3640 Nisl Rd.    231
6       Morgan W. Zamora             416-6030 Vivamus Road    169
7      Lilah O. Morrison                   3859 Mauris Ave    263
8     Chantale Z. Kelley                    3433 Arcu. Rd.    233
9     Randall Q. Mcclure            Ap #584-7470 Nibh. Ave    292
10        Baker C. Hurst               249-6250 Velit. Rd.    208
11       Bevis W. Molina        P.O. Box 935, 1521 At, St.    247
12  Martina B. Schroeder                   689-7600 Mi St.    240
13       Kylie G. Bailey                   1430 Diam. Road    161
14       Steel K. Glover                   757-681 Et, Av.    248
15       Lucas M. Suarez                699-9329 Magna Rd.    216
16   Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.    291
17    Germaine Q. Henson                 589-4921 Duis Ave    215
18     Wilma U. Mcfadden                   6917 Dictum Rd.    463
19   Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.    790

Concatenación usando un campo clave

Creación del primer dataframe.

[9]:
%%writefile /tmp/dataset_1.csv
clientId,name,location
10,Omar Y. Fletcher,6833 Mollis. Rd.
11,Buffy W. Vincent,"P.O. Box 345, 8390 Ante Avenue"
12,Mira N. Franklin,"P.O. Box 445, 323 Cursus Rd."
13,Ferris Q. Le,Ap #791-3809 Eu Street
14,Michael I. Gray,6715 Diam. Rd.
15,Alan T. Mullins,512-3640 Nisl Rd.
16,Morgan W. Zamora,416-6030 Vivamus Road
17,Lilah O. Morrison,3859 Mauris Ave
18,Chantale Z. Kelley,3433 Arcu. Rd.
19,Randall Q. Mcclure,Ap #584-7470 Nibh. Ave
Overwriting /tmp/dataset_1.csv

Creación del segundo dataframe.

[10]:
%%writefile /tmp/dataset_2.csv
clientId,name,location
20,Baker C. Hurst,249-6250 Velit. Rd.
21,Bevis W. Molina,"P.O. Box 935, 1521 At, St."
22,Martina B. Schroeder,689-7600 Mi St.
23,Kylie G. Bailey,1430 Diam. Road
24,Steel K. Glover,"757-681 Et, Av."
25,Lucas M. Suarez,699-9329 Magna Rd.
26,Anastasia Q. Mccray,"P.O. Box 780, 4487 Lobortis, St."
27,Germaine Q. Henson,589-4921 Duis Ave
28,Wilma U. Mcfadden,6917 Dictum Rd.
29,Merritt Q. Martinez,"P.O. Box 469, 7833 Euismod Av."
Overwriting /tmp/dataset_2.csv

Creación del tercer dataframe.

Note que el campo clientId está en un orden diferente al de los archivos.

[11]:
%%writefile /tmp/bonus.csv
clientId, bonus
28, 463
29, 790
11, 138
12, 227
15, 231
24, 248
25, 216
26, 291
10, 279
13, 160
14, 267
27, 215
16, 169
17, 263
18, 233
19, 292
20, 208
21, 247
22, 240
23, 161
Overwriting /tmp/bonus.csv

Carga y concatenación de los dos primeros dataframes.

[12]:
dataset_1 = pd.read_csv("/tmp/dataset_1.csv")
dataset_2 = pd.read_csv("/tmp/dataset_2.csv")
datasets_12 = pd.concat(
    [
        dataset_1,
        dataset_2,
    ],
    ignore_index=True,
)

#
# Usa la columna clientId como índice de los
# registros
#
datasets_12.set_index("clientId", inplace=True)
datasets_12
[12]:
                          name                          location
clientId
10            Omar Y. Fletcher                  6833 Mollis. Rd.
11            Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue
12            Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.
13                Ferris Q. Le            Ap #791-3809 Eu Street
14             Michael I. Gray                    6715 Diam. Rd.
15             Alan T. Mullins                 512-3640 Nisl Rd.
16            Morgan W. Zamora             416-6030 Vivamus Road
17           Lilah O. Morrison                   3859 Mauris Ave
18          Chantale Z. Kelley                    3433 Arcu. Rd.
19          Randall Q. Mcclure            Ap #584-7470 Nibh. Ave
20              Baker C. Hurst               249-6250 Velit. Rd.
21             Bevis W. Molina        P.O. Box 935, 1521 At, St.
22        Martina B. Schroeder                   689-7600 Mi St.
23             Kylie G. Bailey                   1430 Diam. Road
24             Steel K. Glover                   757-681 Et, Av.
25             Lucas M. Suarez                699-9329 Magna Rd.
26         Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.
27          Germaine Q. Henson                 589-4921 Duis Ave
28           Wilma U. Mcfadden                   6917 Dictum Rd.
29         Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.

Carga y concatenación del tercer dataframe.

[13]:
bonus = pd.read_csv("/tmp/bonus.csv")
bonus = bonus.set_index("clientId")
bonus
[13]:
          bonus
clientId
28          463
29          790
11          138
12          227
15          231
24          248
25          216
26          291
10          279
13          160
14          267
27          215
16          169
17          263
18          233
19          292
20          208
21          247
22          240
23          161
[14]:
dataset_full = pd.concat(
    [
        datasets_12,
        bonus,
    ],
    axis=1,
)
dataset_full
[14]:
                          name                          location  bonus
clientId
10            Omar Y. Fletcher                  6833 Mollis. Rd.    279
11            Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue    138
12            Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.    227
13                Ferris Q. Le            Ap #791-3809 Eu Street    160
14             Michael I. Gray                    6715 Diam. Rd.    267
15             Alan T. Mullins                 512-3640 Nisl Rd.    231
16            Morgan W. Zamora             416-6030 Vivamus Road    169
17           Lilah O. Morrison                   3859 Mauris Ave    263
18          Chantale Z. Kelley                    3433 Arcu. Rd.    233
19          Randall Q. Mcclure            Ap #584-7470 Nibh. Ave    292
20              Baker C. Hurst               249-6250 Velit. Rd.    208
21             Bevis W. Molina        P.O. Box 935, 1521 At, St.    247
22        Martina B. Schroeder                   689-7600 Mi St.    240
23             Kylie G. Bailey                   1430 Diam. Road    161
24             Steel K. Glover                   757-681 Et, Av.    248
25             Lucas M. Suarez                699-9329 Magna Rd.    216
26         Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.    291
27          Germaine Q. Henson                 589-4921 Duis Ave    215
28           Wilma U. Mcfadden                   6917 Dictum Rd.    463
29         Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.    790
[15]:
#
# Se convierte el clientId a una columna
#
dataset_full = dataset_full.reset_index()
dataset_full
[15]:
    clientId                  name                          location  bonus
0         10      Omar Y. Fletcher                  6833 Mollis. Rd.    279
1         11      Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue    138
2         12      Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.    227
3         13          Ferris Q. Le            Ap #791-3809 Eu Street    160
4         14       Michael I. Gray                    6715 Diam. Rd.    267
5         15       Alan T. Mullins                 512-3640 Nisl Rd.    231
6         16      Morgan W. Zamora             416-6030 Vivamus Road    169
7         17     Lilah O. Morrison                   3859 Mauris Ave    263
8         18    Chantale Z. Kelley                    3433 Arcu. Rd.    233
9         19    Randall Q. Mcclure            Ap #584-7470 Nibh. Ave    292
10        20        Baker C. Hurst               249-6250 Velit. Rd.    208
11        21       Bevis W. Molina        P.O. Box 935, 1521 At, St.    247
12        22  Martina B. Schroeder                   689-7600 Mi St.    240
13        23       Kylie G. Bailey                   1430 Diam. Road    161
14        24       Steel K. Glover                   757-681 Et, Av.    248
15        25       Lucas M. Suarez                699-9329 Magna Rd.    216
16        26   Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.    291
17        27    Germaine Q. Henson                 589-4921 Duis Ave    215
18        28     Wilma U. Mcfadden                   6917 Dictum Rd.    463
19        29   Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.    790

Append

[16]:
#
# Append permite pegar un dataframe debajo de
# otro haciendo coincidir las columnas
#
dataset_1 = pd.read_csv("/tmp/dataset_1.csv")
dataset_2 = pd.read_csv("/tmp/dataset_2.csv")
dataset_2 = dataset_2[["name", "clientId", "location"]]
dataset_1.append([dataset_2, bonus])
[16]:
    clientId                  name                          location  bonus
0       10.0      Omar Y. Fletcher                  6833 Mollis. Rd.    NaN
1       11.0      Buffy W. Vincent    P.O. Box 345, 8390 Ante Avenue    NaN
2       12.0      Mira N. Franklin      P.O. Box 445, 323 Cursus Rd.    NaN
3       13.0          Ferris Q. Le            Ap #791-3809 Eu Street    NaN
4       14.0       Michael I. Gray                    6715 Diam. Rd.    NaN
5       15.0       Alan T. Mullins                 512-3640 Nisl Rd.    NaN
6       16.0      Morgan W. Zamora             416-6030 Vivamus Road    NaN
7       17.0     Lilah O. Morrison                   3859 Mauris Ave    NaN
8       18.0    Chantale Z. Kelley                    3433 Arcu. Rd.    NaN
9       19.0    Randall Q. Mcclure            Ap #584-7470 Nibh. Ave    NaN
0       20.0        Baker C. Hurst               249-6250 Velit. Rd.    NaN
1       21.0       Bevis W. Molina        P.O. Box 935, 1521 At, St.    NaN
2       22.0  Martina B. Schroeder                   689-7600 Mi St.    NaN
3       23.0       Kylie G. Bailey                   1430 Diam. Road    NaN
4       24.0       Steel K. Glover                   757-681 Et, Av.    NaN
5       25.0       Lucas M. Suarez                699-9329 Magna Rd.    NaN
6       26.0   Anastasia Q. Mccray  P.O. Box 780, 4487 Lobortis, St.    NaN
7       27.0    Germaine Q. Henson                 589-4921 Duis Ave    NaN
8       28.0     Wilma U. Mcfadden                   6917 Dictum Rd.    NaN
9       29.0   Merritt Q. Martinez    P.O. Box 469, 7833 Euismod Av.    NaN
28       NaN                   NaN                               NaN  463.0
29       NaN                   NaN                               NaN  790.0
11       NaN                   NaN                               NaN  138.0
12       NaN                   NaN                               NaN  227.0
15       NaN                   NaN                               NaN  231.0
24       NaN                   NaN                               NaN  248.0
25       NaN                   NaN                               NaN  216.0
26       NaN                   NaN                               NaN  291.0
10       NaN                   NaN                               NaN  279.0
13       NaN                   NaN                               NaN  160.0
14       NaN                   NaN                               NaN  267.0
27       NaN                   NaN                               NaN  215.0
16       NaN                   NaN                               NaN  169.0
17       NaN                   NaN                               NaN  263.0
18       NaN                   NaN                               NaN  233.0
19       NaN                   NaN                               NaN  292.0
20       NaN                   NaN                               NaN  208.0
21       NaN                   NaN                               NaN  247.0
22       NaN                   NaN                               NaN  240.0
23       NaN                   NaN                               NaN  161.0