Как исправить соединение между двумя наборами данных - PullRequest
1 голос
/ 19 апреля 2019

Проблема : когда я пытаюсь объединить или объединить два набора данных, задав один и тот же индекс, он создает наборы данных с дубликатами.

Создание первого кадра данных (UNI):

import csv
import pandas as pd
import os
import os.path

fullName=os.getcwd()
full_filename = os.path.join(fullName,'Rankings.csv')
file_stream = open(full_filename, mode='r', newline='')

reader = csv.reader(file_stream, delimiter=",")

# read and ignore the first line
header = next(reader)
data = []
# read the remaining part of the file
for i in range(2000):
info = next(reader)
data += [info]
file_stream.close()

dfUNI = pd.DataFrame(data)
dfUNI.columns = header
#I Renamed column 1 to be able to merge the two datasets with the same "Name" column
cols = dfUNI.columns.get_values()
cols[1] = 'Name'
dfUNI.columns = cols

Создайте второй фрейм данных (Тарифы):

full_filename = os.path.join(fullName,'Fees.csv')
file_stream = open(full_filename, mode='r',      newline='',encoding="ISO-8859-1");
#I used encoding to remove reading problems
reader = csv.reader(file_stream, delimiter=",")
# read and ignore the first line
header = next(reader)
data = []
# read the remaining part of the file
for i in range(200):
    info = next(reader)
    data += [info]
file_stream.close()

dfFees = pd.DataFrame(data)
dfFees.columns = header
del dfUNI["international"]
del dfUNI["income"]
del dfUNI["female_male_ratio"]
del dfUNI["student_staff_ratio"]
del dfUNI["year"]
dfUNI.set_index("Name")
dfFees.set_index("Name")
dfFees

Объедините их вместе:

df=dfUNI.set_index("Name")
df2=dfFees.set_index("Name")
df.join(df2,how="outer")

Я ожидал набор данных с информацией из dfFees / df2 "(второй) набор данных, добавленный в правильных строках (на "Name") к dfUNI / df (первый) набор данных.

1 Ответ

0 голосов
/ 19 апреля 2019

Перво-наперво, так как вы используете 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")

Вы получали дубликаты, потому что вы выполняли «внешнее соединение», которое объединяет данные и не пропускает ни одного. (Проверьте это .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...