2017-10-10 29 views
0

我似乎有各地加盟一些問題/大熊貓合併。 (我從來沒有這個問題到現在爲止。)所以,現在我有這樣的代碼至今:似乎無法獲得合併或加入在Python大熊貓工作

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個dataframes我想基於SSN合併到一起。 (兩者都有SSN專欄)但無論出於何種原因,我似乎無法使其工作。

我已經試過以下,但,當我打電話合併,我的兩個SSN列不匹配。 (例如我得SSN1是485358751和SSN2是952147652爲行1.我所有的例子都是假的)兩個核潛艇沒有人可以相互匹配:

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個dataframes印刷數據類型,一旦他們都是進口的。

ATTR:

LAST_NAME對象 FIRST_NAME對象 ALTRUISTA_ID的int64 PATIENT_DOB對象 RISK_CATEGORY_NAME對象 RISK_SCORE float64 健康計劃對象 THL_STATUS對象 ASSIGNED DATE /歸因DATE對象 ADDRESS對象 PHONE NUMBER float64 INSURANCE ID float64 SSN INT64 PROGRAM_NAME對象s 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 D型細胞:對象

數據:

CLIENT_ID的int64 SSN對象 CLIENTNAME對象 D型:物件

所以現在我需要將我的SSN從attr數據幀轉換爲一個字符串。我一直在使用attr['SSN'].apply(str)來做到這一點。 (我是用attr['SSN'] = attr['SSN'].astype(object)但它不工作,我想這是我最初的問題。)這表明,一旦我運行這個數據類型已經改變:SSN對象。現在我的合併:merged = pd.merge(attr, data, on='SSN', how='outer')。它看起來像它的工作!

+0

'.join'在'.merge'加入指定列時加入兩個數據框的索引。爲什麼不''如何='內心',默認參數? – Parfait

回答

0

join默認情況下會加入索引,所以除非您將SSN用作DataFrame的索引,否則結果將不匹配。如果您不想加入索引,則可以使用on參數指定要加入的列。 (另外值得一提的是,join不左默認加入,這可能是也可能不是你想要的。)

mergehow='outer'會(由外連接定義)給你NaN■如果有任何行一個DataFrame,但不匹配指定鍵上的其他DataFrame。所以我會期望NaN s,除非在DataFrame之間存在完美的1:1 SSN映射。根據你正在嘗試做什麼,做一個inner連接會更有意義嗎?

+0

我試過兩種方法。我已經嘗試將SSN設置爲1 df的索引,並且在使用連接時都設置了這兩個索引。我也嘗試過使用on = ['SSN'],但我仍然在我的行中找到匹配錯誤的SSN。 合併我的整個數據幀都是NaN。第一個數據框(attr)有它的列,然後是假想連接的dataframe2(數據)與NaN列。向下滾動,然後出現反轉。所有attr的數據都是NaN,並且數據的列正在填充。 無論出於何種原因,它都不能理解在兩個數據幀之間存在匹配的SSN。 –