我有MultiIndex数据帧(表1(,我想合并来自另一个非MultiIndex数据帧的特定列(表2(。
表1示例:
>>> name 2020-10-21 2020-10-22 ...
Column 9 10 11 12 9 10 11 12
0 A5 2.1 2.2 2.4 2.8 5.4 3.4 1.1 7.3
1 B9 7.2 1.2 14.5 7.5 3.4 5.2 6.4 8.1
2 C3 1.1 6.5 8.4 9.1 1.1 4.3 6.5 8.7
...
表2示例:
>>>name indc control code
0 A5 0.32 yes 1
1 C3 0.11 no 2
2 B18 0.23 yes 2
3 B9 0.45 no 3
我想合并列";代码";基于密钥";name";从表2(和表1中的"索引"(得到te名称旁边的代码:
>>> index 2020-10-21 2020-10-22 ...
Column code 9 10 11 12 9 10 11 12
0 A5 1 2.1 2.2 2.4 2.8 5.4 3.4 1.1 7.3
1 B9 3 7.2 1.2 14.5 7.5 3.4 5.2 6.4 8.1
2 C3 2 1.1 6.5 8.4 9.1 1.1 4.3 6.5 8.7
...
我知道当索引不是多索引级别时如何合并,然后我这样做:
df = table1.merge(table2[['code','name']], how = 'left',
left_on = 'index', right_on = 'name')
但现在我得到错误:
UserWarning:不同级别之间的合并可能会产生意外结果(左侧2级,右侧1级(警告。警告(msg,用户警告(
然后:
ValueError:"index"不在列表中
当我打印列时,我可以看到你的列像元组,但我不知道为什么它说索引不在列表中,就像我打印表1的列时一样:
Index([ ('index', ''), (2020-10-22, 9)...
所以我有点困惑。
我的最终目标是:合并基于列的代码列"name";以及";索引";
对于两个DataFrame
中的正确工作需要MultiIndex
:
df2 = table2[['code','name']].rename(columns={'name':'index'})
df2.columns = pd.MultiIndex.from_product([df2.columns, ['']])
df = table1.merge(df2, how = 'left', on = [('index', '')])
#if necessary reorder columns names
cols = df.columns[:1].tolist() + df.columns[-1:].tolist() + df.columns[1:-1].tolist()
df = df[cols]
print (df)
index code 2020-10-21 2020-10-22
9 10 11 12 9 10 11 12
0 A5 1 2.1 2.2 2.4 2.8 5.4 3.4 1.1 7.3
1 B9 3 7.2 1.2 14.5 7.5 3.4 5.2 6.4 8.1
2 C3 2 1.1 6.5 8.4 9.1 1.1 4.3 6.5 8.7