如何在不将类型从整数更改为浮点类型的情况下将两个数据帧与 nan 合并

How to left merge two dataframes with nan without changing types from integer to float types

我正在尝试通过特定列上的键合并两个 pandas 数据帧(df1 和 df2),但我想保留两个 df 上没有匹配键的行。最后,我想要一个缺少该键列值的 df3。当我使用以下代码执行此操作时,我的整数将转换为浮点类型:

df3 = pd.merge(df1, df2, how= 'left', on=['Species Name'])

我可以通过以下方式将它们转换为 int64:

df3['Species ID'] = df3['Species ID'].astype('Int64')

但随后我的 NaN 被转换为“”,即 'pandas._libs.missing.NAType'。这是一个问题,因为我想使用 psycopg2 将 df3 插入到 postgresql 数据库中,但它不接受这样的 Nas。有谁知道如何正确合并这些 dfs 或如何在不弄乱 Na 格式的情况下修复浮点数?

df1:

Sample ID Species Name
A X
B Y
C NaN

df2:

Species Name Species ID
X 1
Y 2

我最终得到的结果:

Sample ID Species Name Species ID
A X 1.000
B Y 2.000
C NaN NaN

使用 pd.IntXDtype 作为 Species ID 列的数据类型:

df2['Species ID'] = df2['Species ID'].astype(pd.Int8Dtype())
df3 = pd.merge(df1, df2, how= 'left', on=['Species Name'])
print(df3)

# Output
  Sample ID Species Name  Species ID
0         A            X           1
1         B            Y           2
2         C          NaN        <NA>

更多信息:Nullable integer data type