我正在尝试制作一个摘要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
问题是框架按列按字母顺序排序。然后将其插入较大的框架中,并对值进行排序,然后列标签错误。
所以我的问题是,是否有办法确保列标签匹配?
答案 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