给定一个包含MultiIndex列的DataFrame(
model() {
return this.store.createRecord('rental');
}
),我想将另一个DataFrame(d
)设置为'multicolumns'之一,这样顶级有一些标签,并且第二级标签与原始标签相匹配:
d2
如果可能的话,我想使用一个内置的方法加入他们,以实现以下forloop:
nr.seed(0)
abc = ['a', 'b', 'c']
mi = pd.MultiIndex.from_product([['A'], abc])
d = DataFrame(np.random.randint(0, 10, (4, 3)), columns=mi)
d
A
a b c
0 5 0 3
1 3 7 9
2 3 5 2
3 4 7 6
d2 = DataFrame(np.random.randint(0, 10, (4, 3)), columns=abc)
d2
a b c
0 8 8 1
1 6 7 7
2 8 1 5
3 9 8 9
对于具有单级列的DataFrame:
for c2 in d2:
d['B', c2] = d2[c2]
d
A B
a b c a b c
0 5 0 3 8 8 1
1 3 7 9 6 7 7
2 3 5 2 8 1 5
3 4 7 6 9 8 9
我可以做以下事情:
d3 = d.copy()
d3.columns = d3.columns.droplevel(0)
d3 = d3.rename(columns=dict(zip('abc', 'def')))
d3
d e f
0 5 0 3
1 3 7 9
2 3 5 2
3 4 7 6
但是当我使用MultiIndexed DataFrame尝试这个时,我会收到错误:
d3[d2.columns] = d2
d3
d e f a b c
0 5 0 3 8 8 1
1 3 7 9 6 7 7
2 3 5 2 8 1 5
3 4 7 6 9 8 9
是否有内置方法来执行此操作? (基本上一次为多个列做this)。
答案 0 :(得分:1)
<强>更新强>
def add_multicolumn(df, df2, new_col_name):
tmp = df2.copy() # make copy, otherwise df2 will be changed !!!
tmp.columns = pd.MultiIndex.from_product([[new_col_name], df2.columns.tolist()])
return pd.concat([df, tmp], axis=1)
假设我们有以下DF并且我们想要添加第三个“多列” - C
:
In [114]: d
Out[114]:
A B
a b c a b c
0 5 5 7 0 7 2
1 5 3 9 0 5 5
2 5 8 5 5 5 7
3 5 4 5 4 5 2
使用我们的功能:
In [132]: add_multicolumn(d, d2, 'C')
Out[132]:
A B C
a b c a b c a b c
0 5 5 7 0 7 2 0 7 2
1 5 3 9 0 5 5 0 5 5
2 5 8 5 5 5 7 5 5 7
3 5 4 5 4 5 2 4 5 2
OLD回答:
你可以使用pd.concat():
来完成In [35]: d = pd.concat({'A':d['A'], 'B':d2}, axis=1)
In [36]: d
Out[36]:
A B
a b c a b c
0 7 3 9 0 7 2
1 9 4 5 0 5 5
2 7 6 1 5 5 7
3 2 5 7 4 5 2
说明:
In [37]: d['A']
Out[37]:
a b c
0 7 3 9
1 9 4 5
2 7 6 1
3 2 5 7
In [40]: pd.concat({'A':d['A'], 'B':d2}, axis=1)
Out[40]:
A B
a b c a b c
0 5 5 7 0 7 2
1 5 3 9 0 5 5
2 5 8 5 5 5 7
3 5 4 5 4 5 2