将具有两个项索引的两个熊猫数据帧合并会返回非唯一键

时间:2020-04-01 11:53:55

标签: python pandas dataframe merge dask

编辑

我写这篇文章时认为问题出在merge()join()上,但是问题出在从groupby()获得的结果上。如果您发现此信息,则可能是由于相同的原因而遇到相同的错误。因此,我保持标题不变。

原始帖子

我有两个大熊猫数据帧,每个大熊猫数据帧包含三列。类型是:

A: category
B: uint32
C: uint32

我将它们按前两列分组,并应用一个函数,如下所示:

df1 = df1.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})
df2 = df2.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})

作为结果的两个数据帧具有三列,以及一个由两个术语组成的索引(最初是A和B列)。他们看起来像这样:

                          Res_1       Res_2       Res_3
A        B                                   
chrA01   1                    0    0.000000    0.000000
         5001                 0    0.000000    0.000000
         35001             2656    0.967225   21.346008
         55001              261    1.000000   27.003832
chrC01   1                  131    0.411950    8.610687
...                         ...         ...         ...
         10001                0    0.000000    0.000000
chrA01   30001             1511    1.000000   25.416943
         90001             1407    1.000000   25.073915
chrC01   30001                0    0.000000    0.000000
         90001                0    0.000000    0.000000

然后,我想使用df1df2索引的并集将它们合并到一个数据帧中,因此我使用了how="outer"选项on=["A", "B"]

df = pd.merge(df1, df2, how="outer", on=["A", "B"], validate="one_to_one")

但是,由于我正在做validate="one_to_one",因此出现此错误:

pandas.errors.MergeError: Merge keys are not unique in either left or right dataset; not a one-to-one merge

我知道密钥应该是唯一的,因为我已经评估了两个数据帧的生成及其内容。

也许我做错了merge()?我怀疑我正在指定on=...选项的途中。我是否可以指定on=index,即使它是具有两个术语的索引?

1 个答案:

答案 0 :(得分:0)

在提出了有关索引和唯一索引的建议之后,我发现了问题。在groupby()A上都执行B时,用apply()调用的函数返回一行,结果正确,其中一个充满NaN值。原因尚未确定。

由于输出排序很奇怪,所以这两个输出在数据帧中不是一个接一个。因此,撰写本文时,我没有看到第二行NaN

生成数据帧后,我现在为每个数据帧运行df.dropna(how="all"),重复的索引消失了。我觉得这不是一个干净的解决方案,因为这些NaN行最初甚至都不应该存在,但是现在我找到了这个补丁。