【发布时间】:2018-03-22 09:30:03
【问题描述】:
我似乎在加入/合并熊猫方面遇到了一些问题。 (直到现在我从来没有遇到过这个问题。)所以,到目前为止我有这个代码:
from difflib import SequenceMatcher
import pandas as pd
import numpy as np
import pyodbc
conn_str = (
r'Driver={SQL Server};'
r'Server=fake.fake.lan;'
r'Database=fake;'
r'Trusted_Connection=yes;'
)
cnxn = pyodbc.connect(conn_str)
attr = pd.read_excel('AttrList.xlsx')
attr['PATIENT NAME1'] = attr['LAST_NAME'] + ', ' + attr['FIRST_NAME']
sql = '''SELECT ssn.Client_ID,
ssn.SSN,
n.LastName + ', ' + n.FirstName AS clientname
FROM limiteddb.dbo.Client_SSN AS ssn
INNER JOIN limiteddb.dbo.ClientName AS n ON n.Client_ID = ssn.Client_ID
AND n.ORG_ID = 1;'''
data = pd.DataFrame(pd.read_sql(sql, cnxn))
现在,我有 2 个数据框我想基于 SSN 合并在一起。 (两者都有一个 SSN 专栏)但无论出于何种原因,我似乎无法让它发挥作用。
我尝试了以下方法,但是当我调用合并时,我的两个 SSN 列不匹配。 (例如,第 1 行的 SSN1 为 485358751,SSN2 为 952147652。我所有的例子都是假的。)这两个 SSN 似乎都不匹配:
merged = attr.join(data, lsuffix='1', rsuffix='2')`
我也尝试过合并,但我几乎所有数据都得到了 NaN 值:
merged = pd.merge(attr, data, on='SSN', how='outer')
我查看了 Excel 中的数据,当我查看那里的匹配项时,我知道大约 90% 的数据应该与 SSN 匹配。我还检查了我的数据类型。任何建议/想法/帮助表示赞赏。
编辑:对于任何想知道的人,我有明显的加入/合并。我知道该怎么做。我不确定是什么原因造成的,但由于某种原因,我的两个数据框没有意识到它们共享很多 SSN。例如,当我进行内部连接时,我的数据框是空的。我已经检查以确保我的两个 SSN 都是对象。 attr['SSN'] = attr['SSN'].astype(object)
编辑:这是我的 2 个数据帧导入后的打印数据类型。
属性:
LAST_NAME 对象 FIRST_NAME 对象 ALTRUSTA_ID int64 PATIENT_DOB 对象 RISK_CATEGORY_NAME 对象 RISK_SCORE float64 健康计划对象 THL_STATUS 对象 分配日期/属性日期对象 地址对象 电话号码 float64 保险 ID float64 社会保障号 int64 PROGRAM_NAMES 对象 LAST_CLAIM float64 LAST_VISIT_DATE float64 NEXT_VISIT_DATE float64 PCP_NAME 对象 ER_VISITS int64 APP_VISITS int64 ADTDAYS_COUNT int64 DUE_DAYS int64 数据类型:对象
数据:
Client_ID int64 SSN 对象 客户名对象 数据类型:对象
所以此时我需要将我的 SSN 从 attr 数据帧转换为字符串。我一直在使用attr['SSN'].apply(str) 来执行此操作。 (我使用的是attr['SSN'] = attr['SSN'].astype(object),但它不起作用。我认为这是我最初的问题。)这里它显示一旦我运行这个数据类型已经改变:SSN 对象。现在我的合并:merged = pd.merge(attr, data, on='SSN', how='outer')。看起来成功了!
【问题讨论】:
-
.join加入两个数据帧的索引,而.merge加入指定列。为什么不how='inner',默认参数?