![](/img/trans.png)
[英]How do I concatenate columns in two pandas dataframes with different indexes and non-unique keys
[英]Merging two pandas dataframes with two-term index returns non-unique keys
编辑
我写这篇文章时认为问题出在merge()
或join()
,但问题出在从groupby()
获得的结果上。 如果你找到了这篇文章,那么你会因为同样的原因得到同样的错误。 因此,我保持标题不变。
原帖
我有两个 Pandas 数据框,每个数据框包含三列。 类型是:
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
然后我想使用df1
和df2
索引的联合将它们合并到一个数据帧中,所以我使用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
即使它是具有两个术语的索引?
在查看索引和唯一索引的建议之后,我发现了问题。 在A
和B
上执行groupby()
时,使用apply()
调用的函数返回一行,其中包含正确的结果和一个完整的NaN
值。 原因尚待确定。
由于奇怪的输出排序,这两个输出在数据帧中不是一个接一个。 因此,我在写这篇文章时没有看到第二行NaN
。
生成数据帧后,我现在为每个运行df.dropna(how="all")
并且重复的索引消失了。 我觉得这不是一个干净的解决方案,因为那些NaN
行一开始就不应该存在,但现在我找到了这个补丁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.