【问题标题】:can't seem to get merge or joins to work in python pandas似乎无法在 python pandas 中合并或加入工作
【发布时间】:2018-03-22 09:30:03
【问题描述】:

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

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 专栏)但无论出于何种原因,我似乎无法让它发挥作用。

我尝试了以下方法,但是当我调用合并时,我的两个 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 个数据帧导入后的打印数据类型。

属性:

LAST_NAME 对象 FIRST_NAME 对象 ALTRUSTA_ID int64 PATIENT_DOB 对象 RISK_CATEGORY_NAME 对象 RISK_SCORE float64 健康计划对象 THL_STATUS 对象 分配日期/属性日期对象 地址对象 电话号码 float64 保险 ID float64 社会保障号 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 数据类型:对象

数据:

Client_ID int64 SSN 对象 客户名对象 数据类型:对象

所以此时我需要将我的 SSN 从 attr 数据帧转换为字符串。我一直在使用attr['SSN'].apply(str) 来执行此操作。 (我使用的是attr['SSN'] = attr['SSN'].astype(object),但它不起作用。我认为这是我最初的问题。)这里它显示一旦我运行这个数据类型已经改变:SSN 对象。现在我的合并:merged = pd.merge(attr, data, on='SSN', how='outer')。看起来成功了!

【问题讨论】:

  • .join 加入两个数据帧的索引,而.merge 加入指定列。为什么不how='inner',默认参数?

标签: python pandas merge


【解决方案1】:

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

mergehow='outer' 将(根据外连接的定义)如果在一个 DataFrame 中有任何行但在指定键上匹配时另一个 DataFrame 中没有任何行,则会给你NaNs。所以我希望NaNs 除非在 DataFrame 之间存在完美的 SSN 1:1 映射。根据您要执行的操作,加入inner 是否更有意义?

【讨论】:

  • 两种方法我都试过了。我尝试将 SSN 设置为 1 df 的索引,并且在使用 join 时两者都设置。我也尝试过使用 on = ['SSN'] ,但我的行中仍然有错误的 SSN 匹配。通过合并,我的整个数据框都以 NaN 结束。第一个数据框(attr)有它的列,然后是数据框2(数据)的所谓连接列和NaN。向下滚动,然后出现反转。 attr 的所有数据都是 NaN,并且正在填充数据的列。无论出于何种原因,它都无法理解两个数据帧之间存在匹配的 SSN。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2015-09-20
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
相关资源
最近更新 更多