pandas匹配层次索引的级别

时间:2014-07-03 12:38:33

标签: python pandas indexing

我正在尝试制作一个摘要DataFrame但是它们填充的方式导致了问题,因为没有对标签进行检查。

这是一个玩具示例:

import numpy as np
import pandas as pd

arrays = [np.hstack([ ['one']*3, ['two']*3]), ['Dog', 'Bird', 'Cat']*2]
columns = pd.MultiIndex.from_arrays(arrays, names=['foo', 'bar'])

df = pd.DataFrame(np.zeros((3,6)),columns=columns,
                  index=pd.date_range('20000103',periods=3))

df['one'] = pd.DataFrame({'Bird' : np.ones(3)*2,
                          'Dog' : np.ones(3),
                          'Cat' : np.ones(3)*3},
                          index= pd.date_range('20000103',periods=3))
df['two'] = pd.DataFrame({'Dog' : np.ones(3)*4,
                          'Bird' : np.ones(3)*5,
                          'Cat' : np.ones(3)*6,},
                          index= pd.date_range('20000103',periods=3))

输出结果为:

foo            one          two
bar        Dog Bird Cat Dog Bird Cat
2000-01-03 2   3    1   5   6    4
2000-01-04 2   3    1   5   6    4
2000-01-05 2   3    1   5   6    4

我期待的地方:

foo            one          two
bar        Dog Bird Cat Dog Bird Cat
2000-01-03 1   2    3   4   5    6
2000-01-04 1   2    3   4   5    6
2000-01-05 1   2    3   4   5    6

问题是框架按列按字母顺序排序。然后将其插入较大的框架中,并对值进行排序,然后列标签错误。

所以我的问题是,是否有办法确保列标签匹配?

2 个答案:

答案 0 :(得分:2)

这应该在关卡上保持一致(尽管它们有些含糊不清如何这样做,例如在哪个级别)。 https://github.com/pydata/pandas/issues/7655

你应该这样做:

In [10]: one = pd.DataFrame({'Bird' : np.ones(3)*2,
                             'Dog' : np.ones(3),
                             'Cat' : np.ones(3)*3},
                             index= pd.date_range('20000103',periods=3))

In [11]: two = pd.DataFrame({'Dog' : np.ones(3)*4,
   ....:                     'Bird' : np.ones(3)*5,
   ....:                     'Cat' : np.ones(3)*6,},
   ....:                     index= pd.date_range('20000103',periods=3))

In [12]: one
Out[12]: 
            Bird  Cat  Dog
2000-01-03     2    3    1
2000-01-04     2    3    1
2000-01-05     2    3    1

In [13]: two
Out[13]: 
            Bird  Cat  Dog
2000-01-03     5    6    4
2000-01-04     5    6    4
2000-01-05     5    6    4

In [14]: concat([one,two],keys=['one','two'],axis=1)
Out[14]: 
             one             two          
            Bird  Cat  Dog  Bird  Cat  Dog
2000-01-03     2    3    1     5    6    4
2000-01-04     2    3    1     5    6    4
2000-01-05     2    3    1     5    6    4

答案 1 :(得分:0)

一种方法是使用较大数据框中的列顺序对临时数据框的列进行重新排序。

In [50]: df['one'] = pd.DataFrame({'Bird' : np.ones(3)*2,
                                   'Dog' : np.ones(3),
                                   'Cat' : np.ones(3)*3},
                                   index= pd.date_range('20000103',periods=3))
                                   [df['one'].columns]

In [51]: df['two'] = pd.DataFrame({'Dog' : np.ones(3)*4,
                                   'Bird' : np.ones(3)*5,
                                   'Cat' : np.ones(3)*6,},
                                   index= pd.date_range('20000103',periods=3))
                                   [df['two'].columns]

In [52]: df
Out[52]: 
foo         one             two           
bar         Dog  Bird  Cat  Dog  Bird  Cat
2000-01-03    1     2    3    4     5    6
2000-01-04    1     2    3    4     5    6
2000-01-05    1     2    3    4     5    6