2017-10-10 1 views
0

Je semble avoir des problèmes pour rejoindre/fusionner des pandas. (Je ne l'ai jamais eu ce problème jusqu'à maintenant.) Donc, je en ce moment ce code jusqu'à présent:ne semble pas pouvoir fusionner ou se joindre à un travail en python pandas

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)) 

Maintenant, à ce moment j'ai 2 dataframes Je voudrais fusionner sur la base SSN. (Les deux ont une colonne SSN) Mais pour une raison quelconque, je ne peux pas sembler le faire fonctionner.

J'ai essayé le suivant mais quand j'appelle fusionné, mes deux colonnes de SSN ne correspondent pas. (. Par exemple, je vais devoir être SSN1 485358751 et 952147652 SSN2 être pour la ligne 1. Tous mes exemples sont faux) Aucun des deux SSNs semblent correspondre les uns aux autres:

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

J'ai aussi essayé fusion mais je le vent avec des valeurs NaN pour à peu près l'ensemble de mes données:

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

J'ai regardé les données dans Excel et quand je regarde les matchs là, je sais que environ 90% de mes données devrait avoir SSN correspondants. J'ai également vérifié mes types de données. Toutes les suggestions/idées/aide sont appréciées.

EDIT: pour tous ceux qui se demandent, j'ai les Joints/Merges évidents. Je sais comment les faire. Je ne suis pas sûr de ce qui cause cela, mais pour une raison quelconque mes deux dataframes ne réalisent pas qu'ils partagent beaucoup de SSN. Quand je fais une jointure interne, mon dataframe est vide par exemple. J'ai vérifié pour m'assurer que mes deux SSN sont des objets. attr['SSN'] = attr['SSN'].astype(object)

EDIT: Voici les types de données imprimés pour mes 2 données une fois importées.

attr:

objet LAST_NAME objet FIRST_NAME ALTRUISTA_ID int64 objet PATIENT_DOB objet RISK_CATEGORY_NAME RISK_SCORE float64 SANTÉ objet PLAN objet THL_STATUS AFFECTE DATE/ATTRIBUÉ objet DATE objet ADRESSE NUMÉRO DE TÉLÉPHONE float64 ASSURANCE ID float64 SSN int64 PROGRAM_NAME objet S LAST_CLAIM float64 LAST_VISIT_DATE float64 NEXT_VISIT_DATE float64 objet PCP_NAME ER_VISITS int64 APP_VISITS int64 ADTDAYS_COUNT int64 DUE_DAYS int64 DTYPE: objet

données:

Client_ID int64 objet SSN objet nomclient DTYPE : objet

Donc, à ce stade, j'ai besoin de transformer mon SSN de l'image de données attr en une chaîne. J'ai utilisé attr['SSN'].apply(str) pour ce faire. (J'utilisais attr['SSN'] = attr['SSN'].astype(object) mais ça ne fonctionnait pas Je pense que c'était mon problème initial.) Ici, il montre que le type de données a changé une fois que j'ai exécuté ceci: objet SSN. Maintenant pour ma fusion: merged = pd.merge(attr, data, on='SSN', how='outer'). On dirait que ça a marché!

+0

'.join' se joint à l'index des deux données tandis que' .merge' se joint à la colonne spécifiée. Pourquoi pas 'how = 'inner'', l'argument par défaut? – Parfait

Répondre

0

join rejoint les index par défaut, donc à moins que vous n'utilisiez SSN comme index de votre DataFrame, les résultats ne correspondront pas. Si vous ne souhaitez pas vous joindre à l'index, vous pouvez spécifier à quelle colonne vous devez vous associer avec l'argument on. (Il est également intéressant de noter que join ne une jointure gauche par défaut, qui peut ou peut ne pas être ce que vous voulez.)

merge avec how='outer' sera (par définition de jointure externe) vous donner NaN s s'il y a des lignes un DataFrame mais pas l'autre lors de la correspondance sur les clés spécifiées. Donc je m'attendrais à NaN s à moins qu'il y ait un mappage 1: 1 parfait des SSN entre DataFrames. En fonction de ce que vous essayez de faire, serait-il plus logique de faire une jointure inner?

+0

J'ai essayé les deux façons. J'ai essayé de définir SSN comme index pour 1 df et pour les deux en utilisant join. J'ai également essayé d'utiliser on = ['SSN'] avec, mais je reçois toujours le mauvais SSN correspondant dans mes rangées. Lors de la fusion, l'ensemble de mes données se termine par NaN. La première trame de données (attr) a ses colonnes puis les colonnes supposées jointes de dataframe2 (data) avec NaNs. Faites défiler vers le bas puis l'inverse apparaît. Toutes les données d'attr sont NaN et les colonnes de données sont remplies. Pour une raison quelconque, il ne peut pas comprendre qu'il existe des SSN qui correspondent entre les deux données. –