似乎无法合并或加入在python pandas中工作

时间:2017-10-10 20:52:06

标签: python pandas merge

我似乎在加入/合并大熊猫方面遇到了一些问题。 (到目前为止,我从未遇到过这个问题。)所以,到目前为止我已经有了这个代码:

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')。它看起来很有效!

1 个答案:

答案 0 :(得分:0)

join默认加入索引,因此除非您使用SSN作为DataFrame的索引,否则结果将不匹配。如果您不想加入索引,可以使用on参数指定要加入的列。 (值得注意的是join默认情况下会进行左连接,这可能是也可能不是你想要的。)

带有merge的{​​p> how='outer'(根据外部联接的定义)如果一个DataFrame中有任何行,但在指定键上匹配时,则会给出NaN s。所以我希望NaN s,除非在DataFrame之间存在完美的1:1 SSN映射。根据您的目的,进行inner加入会更有意义吗?