我似乎在加入/合并大熊猫方面遇到了一些问题。 (到目前为止,我从未遇到过这个问题。)所以,到目前为止我已经有了这个代码:
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专栏)但无论出于何种原因,我似乎无法使其发挥作用。
我已经尝试了以下但是当我调用merged时,我的两个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个数据框的打印数据类型。
ATTR:
LAST_NAME对象 FIRST_NAME对象 ALTRUISTA_ID int64 PATIENT_DOB对象 RISK_CATEGORY_NAME对象 RISK_SCORE float64 健康计划对象 THL_STATUS对象 ASSIGNED DATE / ATTRIBUTED DATE对象 ADDRESS对象 电话号码float64 保险ID float64 SSN 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 dtype:object
数据:
Client_ID int64 SSN对象 clientname对象 dtype:object
所以此时我需要将我的SSN从attr数据帧转换为字符串。我一直在用attr['SSN'].apply(str)
来做这件事。 (我正在使用attr['SSN'] = attr['SSN'].astype(object)
但它没有工作。我认为这是我最初的问题。)这里显示一旦我运行这个数据类型已经改变了:SSN对象。现在为我合并:merged = pd.merge(attr, data, on='SSN', how='outer')
。它看起来很有效!
答案 0 :(得分:0)
join
默认加入索引,因此除非您使用SSN作为DataFrame的索引,否则结果将不匹配。如果您不想加入索引,可以使用on
参数指定要加入的列。 (值得注意的是join
默认情况下会进行左连接,这可能是也可能不是你想要的。)
merge
的{p> how='outer'
(根据外部联接的定义)如果一个DataFrame中有任何行,但在指定键上匹配时,则会给出NaN
s。所以我希望NaN
s,除非在DataFrame之间存在完美的1:1 SSN映射。根据您的目的,进行inner
加入会更有意义吗?