Especificar Sufixo no Método join Pandas

  1. Juntar dois DataFrames Utilizando o método DataFrame.join()
  2. Juntar DataFrame com um nome de coluna comum utilizando DataFrame.join() Método

Este tutorial explica como podemos aderir a dois DataFrames em Pandas utilizando o método DataFrame.join() e especificar o sufixo ao aderir.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame({
    'Name': ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
    'Gender':  ["Female", "Male", "Male", "Female", "Female", "Male"],
    'Age': [17, 18, 17, 16, 18, 16]
})

grades_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    "Grades": ["A", "B+", "A-", "A", "B", "A+"]
}
)

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df)

Resultado:

Student DataFrame:
       Name  Gender  Age
0  Jennifer  Female   17
1    Travis    Male   18
2       Bob    Male   17
3      Emma  Female   16
4      Luna  Female   18
5     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+

Explicaremos o método DataFrame.join() demonstrando a união de students_df e grades_df DataFrame.

Juntar dois DataFrames Utilizando o método DataFrame.join()

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame({
    'Name': ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
    'Gender':  ["Female", "Male", "Male", "Female", "Female", "Male"],
    'Age': [17, 18, 17, 16, 18, 16]
})

grades_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    "Grades": ["A", "B+", "A-", "A", "B", "A+"]
}
)

joined_df = student_df.join(grades_df)

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Joined DataFrame:")
print(joined_df, "\n")

Resultado:

Student DataFrame:
       Name  Gender  Age
0  Jennifer  Female   17
1    Travis    Male   18
2       Bob    Male   17
3      Emma  Female   16
4      Luna  Female   18
5     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Joined DataFrame:
       Name  Gender  Age  Roll No Grades
0  Jennifer  Female   17      501      A
1    Travis    Male   18      502     B+
2       Bob    Male   17      503     A-
3      Emma  Female   16      504      A
4      Luna  Female   18      505      B
5     Anish    Male   16      506     A+ 

Junta-se ao student_df e ao grades_df, e cria o joined_df. Por defeito, o método join() utiliza o índice de ambos os DataFrames para se juntar a eles. O método join é Left Join, por defeito. Aqui, todas as linhas da DataFrame esquerda, ou seja, student_df são mantidas no joined_df, e uma linha com DataFrame direita com o mesmo valor do índice da linha na DataFrame esquerda são unidas e colocadas na mesma linha.

Juntar DataFrame com um nome de coluna comum utilizando DataFrame.join() Método

Se tivermos uma coluna com o mesmo nome em ambos os DataFrames que estamos a tentar juntar utilizando o método DataFrame.join(), obtemos um erro com a mensagem ValueError: columns overlap but no suffix specified. Podemos definir os valores dos parâmetros lsuffix e rsuffix no método DataFrame.join() para resolver o erro.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    'Name': ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
    'Gender':  ["Female", "Male", "Male", "Female", "Female", "Male"],
    'Age': [17, 18, 17, 16, 18, 16]
})

grades_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    "Grades": ["A", "B+", "A-", "A", "B", "A+"]
}
)

joined_df = student_df.join(grades_df, lsuffix="_left", rsuffix="_right")

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Joined DataFrame:")
print(joined_df, "\n")

Resultado:

Student DataFrame:
   Roll No      Name  Gender  Age
0      501  Jennifer  Female   17
1      502    Travis    Male   18
2      503       Bob    Male   17
3      504      Emma  Female   16
4      505      Luna  Female   18
5      506     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Joined DataFrame:
   Roll No_left      Name  Gender  Age  Roll No_right Grades
0           501  Jennifer  Female   17            501      A
1           502    Travis    Male   18            502     B+
2           503       Bob    Male   17            503     A-
3           504      Emma  Female   16            504      A
4           505      Luna  Female   18            505      B
5           506     Anish    Male   16            506     A+ 

Junta-se ao grades_df à direita do student_df. O DataFrame.join() não funde os DataFrames individuais, ou seja, mesmo que a coluna Roll No seja comum a ambos os DataFrames, eles serão colocados como campos separados depois de join(). Para distinguir o nome da coluna com um nome comum, fornecemos sufixo para ambas as colunas no DataFrame esquerdo e direito utilizando os parâmetros lsuffix e rsuffix.

Alternativamente, podemos também DataFrame.merge() método para resolver o problema passando o nome da coluna comum como um parâmetro on para o método.

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

student_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    'Name': ["Jennifer", "Travis", "Bob", "Emma", "Luna", "Anish"],
    'Gender':  ["Female", "Male", "Male", "Female", "Female", "Male"],
    'Age': [17, 18, 17, 16, 18, 16]
})

grades_df = pd.DataFrame({
    "Roll No": [501, 502, 503, 504, 505, 506],
    "Grades": ["A", "B+", "A-", "A", "B", "A+"]
}
)

merged_df = student_df.merge(grades_df, on="Roll No")

print("Student DataFrame:")
print(student_df, "\n")

print("Grades DataFrame:")
print(grades_df, "\n")

print("Merged DataFrame:")
print(merged_df, "\n")

Resultado:

Student DataFrame:
   Roll No      Name  Gender  Age
0      501  Jennifer  Female   17
1      502    Travis    Male   18
2      503       Bob    Male   17
3      504      Emma  Female   16
4      505      Luna  Female   18
5      506     Anish    Male   16 

Grades DataFrame:
   Roll No Grades
0      501      A
1      502     B+
2      503     A-
3      504      A
4      505      B
5      506     A+ 

Merged DataFrame:
   Roll No      Name  Gender  Age Grades
0      501  Jennifer  Female   17      A
1      502    Travis    Male   18     B+
2      503       Bob    Male   17     A-
3      504      Emma  Female   16      A
4      505      Luna  Female   18      B
5      506     Anish    Male   16     A+ 

Funde os DataFrames student_df e grades_df num único DataFrame. Neste caso, a coluna Roll No será fundida numa única coluna para ambos os DataFrames.