python-3.x - 如何修复两个数据集之间的连接
问题描述
问题:当我尝试合并或连接两个数据集,设置相同的索引时,它会生成一个带有重复的数据集。
创建第一个数据帧(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
(第二个)数据集的信息,这些数据以正确的行(by "Name"
)添加到dfUNI
/ df
(第一个)数据集。
解决方案
首先,由于您正在使用pandas
,您可能希望简化在这些 csv 中的阅读方式 using 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)
现在是您真正要寻找的部分:您需要使用left join。Pandas 对其数据帧使用了很多 SQL-esk 方法。
dfFINAL = dfUNI.join(dfFees, how="left") # "left" is the default btw
或者,您可以使用方法的 " on
" 参数,而不是预先设置索引.join
:
dfFINAL = dfUNI.join(dfFees, how="left", on="Name")
你得到了重复,因为你正在做一个“外部连接”,它将数据放在一起并且不会遗漏任何数据。(看看这个。)
推荐阅读
- ruby-on-rails - HashWithIndifferentAccess 不适用于 Rails 5 中的 % 格式运算符
- sublimetext3 - 从 ST 菜单覆盖或删除默认项目
- c# - 尝试激活登录控制器时无法解析 IdentityUserManager 类型的服务
- windows - 内核调试器不会使用 .crash 使系统崩溃
- javascript - 如何在javascript中初始化特殊对象,即接口?
- c++ - 无法从成员函数 strncpy 到类成员字符串(字符数组)
- c++ - 无法从使用代码创建的存档中读取存档文件
- python - 如何制作像jstree这样的组织结构图
- python - 如何使用 python 查看域的声誉?
- php - PHP 是否从我使用 opcache.opcache_compile_file() 编译的文件中的包含执行文件?