2017-10-10 14 views
0

私はpandasに参加/合併する際にいくつかの問題があるようです。 (私は今まで、この問題を持っていたことがありません)だから、今の私はこれまでのところ、このコードを持っている:は、マジックを得ることができないか、または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)) 

は今、この時点で私は私がSSNに基づいて一緒にマージしたい2つのデータフレームを持っています。 (どちらもSSNの列を持っています)しかし何らかの理由で、私はそれを動作させるように見えません。

私は以下を試しましたが、私がマージすると、私の2つのSSN列が一致しません。 (例えば、私はSSN1は485358751とSSN2は、行1の952147652なることがありますすべての私の例は偽物です)2つのSSNのいずれもが互いに一致するように見えるん:私もマージを試してみた

merged = attr.join(data, lsuffix='1', rsuffix='2')` 

しかし、私は私のデータのほとんど全体のためのNaN値で羽目になる:

merged = pd.merge(attr, data, on='SSN', how='outer') 

私はExcelのデータを見てきたし、私はそこに試合を見たとき、私は私のデータの約90%が持っている必要があることを知っています一致したSSN。私は自分のデータ型もチェックしました。どんな提案/アイデアや助けもありがとうございます。

EDIT:不思議な人のために、私は明らかにJoins/mergesを持っています。私はそれらを行う方法を知っています。私はこれを引き起こしているのかどうかはわかりませんが、何らかの理由で私の2つのデータフレームが、多くのSSNを共有していることを認識しません。内部結合を行うと、私のデータフレームは空です。 SSNの両方がオブジェクトであることを確認しました。 attr['SSN'] = attr['SSN'].astype(object)

EDIT:インポートした2つのデータフレームの印刷データ型は次のとおりです。

ATTR: RISK_SCOREのfloat64 ヘルスプランオブジェクト THL_STATUSオブジェクト ASSIGNED DATE /起因日付オブジェクト ADDRESSオブジェクト 電話番号が 保険のfloat64

LAST_NAMEオブジェクト FIRST_NAMEオブジェクト ALTRUISTA_ID PATIENT_DOBオブジェクト RISK_CATEGORY_NAMEオブジェクト INT64 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 DTYPE:オブジェクト

データ: SSNオブジェクト CLIENTNAMEオブジェクト DTYPEのInt64

CLIENT_ID :オブジェクト

この時点で私はSSNをattrデータフレームから文字列にキャストする必要があります。私はこのためにattr['SSN'].apply(str)を使用しています。 (私はattr['SSN'] = attr['SSN'].astype(object)を使用していましたが、動作していませんでした。これは私の最初の問題だと思っています。)これを実行すると、データ型が変更されたことがわかります。今すぐ私のマージのため:merged = pd.merge(attr, data, on='SSN', how='outer')。それは働いたように見えます!

+0

'.join'は両方のデータフレームのインデックスにジョインし、' .merge'は指定されたカラムにジョインします。どうして 'how = 'inner''、デフォルトのarg? – Parfait

答えて

0

joinデフォルトではインデックスに結合されているため、DataFrameのインデックスとしてSSNを使用しない限り、結果は一致しません。インデックスに参加したくない場合は、on引数で結合する列を指定できます。 (それはまたjoinが左にまたはあなたが望むものであってもなくてもよい、デフォルトで参加しないことは注目に値します。)how='outer'

merge任意の行では、存在する場合(外部結合の定義による)あなたNaN Sを与えます1つのDataFrameは指定されたキーで照合するときには他のDataFrameを使用しません。だから、私はNaNが、DataFrames間にSSNの完全な1:1マッピングがない限り、期待しています。あなたがやろうとしていることに応じて、innerに参加する方が合理的でしょうか?

+0

私は両方の方法を試みました。 SSNを1dfのインデックスとして設定してみました。私もon = ['SSN']を使って試してみましたが、私はまだ間違ったSSNを自分の行にマッチさせています。 マージでは、データフレーム全体がNaNとして巻き込まれています。最初のデータフレーム(attr)には列があり、次にNaNとdataframe2(data)の列が結合されています。下にスクロールし、逆を表示します。 attrのデータはすべてNaNであり、データの列はデータを取り込みます。 何らかの理由で、2つのデータフレームに一致するSSNが存在することを理解できません。 –