pandas 1.0以后pd.concat()里join_axes消失的变化

以前的pandas版本太低,pandas==0.24.2,于是升级到了pandas 1.1.1

版本变化太大,当然有很大变化,其中concat合并数据框的参数join_axes被剔除了,本来是用来指定对齐参照索引的,这功能没了

调查了下,说是让用.reindex()来代替。

concat(外接join=’outer’的话)基本功能就是按照各个数据框的索引(没有指定的话就是默认索引)拼接,没有数据的部分就用nan顶替

试验如下:

cands = pd.DataFrame({'order': [1, 2, 3],
                      'a': [10, 20, 30],
                      'b': [40, 50, 60],
                      'c': [70, 80, 90],
                      'd': [100, 110, 120]})
acq = pd.DataFrame({'order': [6, 2, 1],
                    'A': [4, 5, 6],
                    'B':[7, 8, 9]}) 
geo_mean_acq = pd.DataFrame({'order': [1, 3]})

cands:
  order a    b   c   d
0  1    10   40 70 100
1  2    20   50 80 110
2  3    30   60 90 120 

acq:
  order A B
0  6    4 7
1  2    5 8
2  1    6 9

geo_mean_acq:
   order
0   1
1   3

cands.set_index('order', inplace=True)
acq.set_index('order', inplace=True)
先各自把cands和acq的order这一列当作index,方便实验比较

result1 = pd.concat([cands, acq, geo_mean_acq], join='outer', axis=1)

result1:
   a   b    c     d     A    B  order
0 NaN  NaN  NaN  NaN   NaN  NaN 1.0
1 10.0 40.0 70.0 100.0 6.0 9.0 3.0
2 20.0 50.0 80.0 110.0 5.0 8.0 NaN
3 30.0 60.0 90.0 120.0 NaN NaN NaN
6 NaN  NaN  NaN  NaN   4.0 7.0 NaN

也就是说非index列拼接直接是按照各自的索引号对应横着(axis=1时)拼接,
新的索引的最大值是拼接数据里索引最大值,凡是空缺都用Nan来填补

所以在拼接前一定确保要拼接的数据框们和最终合并输出结果时候的索引是一样的

至于.reindex()
cands.reindex(acq.index)
把cands的索引变成acq的索引,当然索引对应的数值也跟着变,排序也变化
结果是:
       a  b    c   d
order
6     NaN NaN NaN NaN
2     20  50 80 110   
1     10  40 70 100 
注意顺序变化了,是6,2,1

假如是pd.concat([cands, acq], join='outer', axis=1)
结果是:
        a     b     c    d   A    B
order
1       10.0 40.0 70.0 100.0 6.0 9.0
2       20.0 50.0 80.0 110.0 5.0 8.0
3       30.0 60.0 90.0 120.0 NaN NaN
6       NaN  NaN   NaN  NaN  4.0 7.0

假如pd.concat([acq, cands], join='outer', axis=1)
结果是:
        A    B    a    b     c     d
order
1       6.0 9.0 10.0 40.0 70.0 100.0
2       5.0 8.0 20.0 50.0 80.0 110.0
3       NaN NaN 30.0 60.0 90.0 120.0
6       4.0 7.0 NaN   NaN  NaN   NaN

trans1 = pd.concat([cands.reindex(acq.index), acq], join='outer', axis=1)
结果是:
trans1:
        a   b    c  d  A B
order
6      NaN NaN NaN NaN 4 7 
2      20  50  80  110 5 8
1      10  40  70  100 6 9

对比结果,用reindex主要是形成了筛选作用限定了要显示出来的
index的值并限定了顺序

pandas1.0以后把以前的join_axes踢掉,索引顺序默认第一个数据框,
没得索引范围的选择,直接是取索引们的并集(以前是依靠join_axes),
合并后第一个数据框放最左边
若要想指定参照索引范围和顺序,则需要利用reindex改变数据框的索引范围和顺序。
当要合并的数据框们各自的索引一样时,索引顺序会保持,如果索引不一样,则
顺序排列。
版本升级后功能被详细分出来了。

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始