Перво-наперво, так как вы используете pandas
, вы можете захотеть упростить способ чтения в этих csv, используя pd.read_csv
( документация здесь ) (Вы также можете использовать pathlib.Path
( doc ) для упрощения манипулирования путем, но я сосредоточился на pandas
):
# Starting from scratch:
import csv
import pandas as pd
import os
import os.path
fullName=os.getcwd()
full_filename_UNI = os.path.join(fullName, "Rankings.csv")
full_filename_Fees = os.path.join(fullName, "Fees.csv")
dfUNI = pd.read_csv(full_filename_UNI, delimiter=",")
dfFees = pd.read_csv(full_filename_UNI, delimiter=",", encoding="ISO-8859-1")
Затем вы можете использовать .rename
( doc ) для переименования этого столбца и .drop
( doc ) вместо del dfUNI["something"]
. Не забудьте аргумент "inplace
" для любого из них, чтобы вам не приходилось каждый раз переопределять переменную, например dfUNI = dfUNI.replace(...)
.
# Start of cleanup for dfUNI ->
dfUNI.rename(index=str, columns={dfUNI.columns[0]: "Name"}, inplace=True)
# Start of cleanup for dfFee ->
colNameDropList = ["international", "income", "female_male_ratio", "student_staff_ratio", "year"]
dfFees.drop(columns=colNameDropList, inplace=True)
# Set the index for both (use inplace!):
dfUNI.set_index("Name", inplace=True)
dfFees.set_index("Name", inplace=True)
Теперь приходит часть, которую вы действительно ищете: вам нужно использовать левое соединение . Pandas использует множество методов SQL-esk для своих фреймов данных.
dfFINAL = dfUNI.join(dfFees, how="left") # "left" is the default btw
ИЛИ вместо предварительной установки индексов можно использовать аргумент "on
" метода .join
:
dfFINAL = dfUNI.join(dfFees, how="left", on="Name")
Вы получали дубликаты, потому что вы выполняли «внешнее соединение», которое объединяет данные и не пропускает ни одного. (Проверьте это .)