Pandas将SingleIndex从CSV合并到MultiIndex

时间:2016-05-21 16:41:57

标签: python-3.x pandas merge multi-index

从CSV文件中获取以下表格:

CSV 1:

    A   B                C
    AA  BB1     BB2     CC
0   1   text    5       7
1   2   text2   6       8
2   3   text3   7       9
在Pandas中

import pandas as pd
mi=pd.read_csv('csv_to_mi.csv',header=[0,1],encoding='latin-1')
mi = mi.rename(columns={'Unnamed: 2_level_0':'B'})
mi

    A   B               C
    AA  BB1      BB2    CC  
0   1   text     5      7
1   2   text2    6      8
2   3   text3    7      9

CSV 2:

    A       D   E
    text    T1  9
    text2   T2  10
    text3   T3  11
在Pandas中

si=pd.read_csv('csv_to_si.csv',encoding='latin-1')
si

    A       D   E
0   text    T1  9
1   text2   T2  10
2   text3   T3  11

我想在m1 ['B','BB1']和s1 ['A']上合并它们以获得此功能(或功能性多索引数据帧):

    A   B               C   D   E
    AA  BB1      BB2    CC  
0   1   text     5      7   T1   9
1   2   text2    6      8   T2   10
2   3   text3    7      9   T3   11

之前我做了类似的事情,似乎没问题,除非我尝试在合并数据框上重命名2列,并且由于某种原因丢弃了所有其他(非重命名)列。我还尝试只读取顶部标题行(作为单索引)的多索引csv,将两者合并在一起,然后使结果进行多索引。这似乎有效,直到我遇到重命名问题。

我尝试首先将单索引数据帧转换为多索引数据帧per jezrael's sage advice(运行良好),然后与多索引数据框合并,但这也不起作用。< / p>

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以将mergedrop-Wsystem-headers

一起使用
('A', 0)

通过评论编辑 - 使用get_level_values

cols = list(zip(si.columns, range(si.shape[1])))
si.columns = pd.MultiIndex.from_tuples(cols)
print (si)
       A   D   E
       0   1   2
0   text  T1   9
1  text2  T2  10
2  text3  T3  11

print (pd.merge(mi,si, left_on=[('B','BB1')], right_on=[('A', 0)]).drop([('A', 0)], axis=1))
   A      B      C   D   E
  AA    BB1 BB2 CC   1   2
0  1   text   5  7  T1   9
1  2  text2   6  8  T2  10
2  3  text3   7  9  T3  11

EDIT1:如果您需要在多列上合并:

print (df)
   A      B      C   D   E
  AA    BB1 BB2 CC   1   2
0  1   text   5  7  T1   9
1  2  text2   6  8  T2  10
2  3  text3   7  9  T3  11

print (df.columns.get_level_values(0))
Index(['A', 'B', 'B', 'C', 'D', 'E'], dtype='object')

cols = list(zip(df.columns.get_level_values(0), df.columns.get_level_values(0)))
df.columns = pd.MultiIndex.from_tuples(cols)
print (df)
   A      B     C   D   E
   A      B  B  C   D   E
0  1   text  5  7  T1   9
1  2  text2  6  8  T2  10
2  3  text3  7  9  T3  11