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é!
'.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