在pandas中组合两个数据帧时出现意外行为

时间:2012-11-07 22:55:24

标签: python pandas

这可能是一个错误,但它也可能是我失踪的大熊猫的微妙之处。我正在组合两个数据帧,结果的索引没有排序。奇怪的是,我从来没有见过一个单独的combine_first实例,它无法保持索引的排序。

>>> a1
                            X  Y
DateTime                                    
2012-11-06 16:00:11.477563      8        80
2012-11-06 16:00:11.477563      8        63
>>> a2
                        X  Y
DateTime                                   
2012-11-06 15:11:09.006507      1        37
2012-11-06 15:11:09.006507      1        36
>>> a1.combine_first(a2)
                            X  Y
DateTime                                   
2012-11-06 16:00:11.477563      8        80
2012-11-06 16:00:11.477563      8        63
2012-11-06 15:11:09.006507      1        37
2012-11-06 15:11:09.006507      1        36
>>> a2.combine_first(a1)
                            X  Y
DateTime                                    
2012-11-06 16:00:11.477563      8        80
2012-11-06 16:00:11.477563      8        63
2012-11-06 15:11:09.006507      1        37
2012-11-06 15:11:09.006507      1        36

我可以重现,所以我很乐意接受建议。关于正在发生的事情的猜测是最受欢迎的。

2 个答案:

答案 0 :(得分:1)

combine_first函数使用index.union来组合索引并对其进行排序。 index.union docstring声明它只在可能的情况下进行排序,因此combine_first不一定会按设计返回排序结果。

对于非单调索引,index.union尝试排序,但如果存在异常则返回未排序的结果。我不知道这是不是一个bug,但是index.union甚至没有尝试对单调索引进行排序,例如你的例子中的日期时间索引。

我在GitHub上打开了一个问题,但我想你现在应该为任何日期时间索引执行a2.combine_first(a1).sort_index()

更新:此错误现已在GitHub上修复

答案 1 :(得分:0)

你真的想要使用.append()吗?

尝试: -

a2.append(a1)

combine_first实际上不是append操作。见 - http://pandas.pydata.org/pandas-docs/dev/basics.html?highlight=combine_first#combining-overlapping-data-sets:-

  

偶尔出现的问题是两个相似数据的组合   设置一个中的值优先于另一个中的值。一个例子   将是代表特定经济指标的两个数据系列   其中一个被认为是“更高质量”。但是,更低   质量系列可能会在历史上延伸或有更多   完整的数据覆盖。因此,我们想结合两个   DataFrame对象,其中一个DataFrame中缺少值   条件性地填充来自另一个的相同标记的值   数据帧。

appendhttp://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.append.html?highlight=append

  

将其他列添加到此框架的列和索引的末尾,   返回一个新对象。不在此框架中的列将添加为新的   列。