Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex
Pandas Merge SingleIndex to MultiIndex from CSV
根据 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'] 上合并它们以获得这个(或功能性 multi-indexed 数据框):
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 列时,它出于某种原因删除了所有其他 (non-renamed) 列。我还尝试读取仅包含顶部 header 行(如 single-indexed)的 multi-indexed csv,将两者合并在一起,然后生成结果 multi-indexed。在我 运行 进入重命名问题之前,这似乎一直有效。
我尝试先将 single-indexed 数据框转换为 multi-indexed 数据框,(效果很好),然后与 multi-indexed 合并,但是那也不管用。
提前致谢!
您可以使用 merge
with drop
列 ('A', 0)
:
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
通过评论编辑 - 使用 get_level_values
:
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
EDIT1:如果您需要合并多列:
print (mi)
A B C
AA BB1 BB2 CC
0 1 text 5 7
1 2 text2 6 8
2 3 text3 7 9
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 1
1 text2 T2 2
2 text3 T3 3
df = (pd.merge(mi,si, left_on=[('B','BB1'),('A','AA')], right_on=[('A', 0), ('E', 2)])
.drop([('A', 0), ('E', 2)], axis=1))
print (df)
A B C D
AA BB1 BB2 CC 1
0 1 text 5 7 T1
1 2 text2 6 8 T2
2 3 text3 7 9 T3
根据 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'] 上合并它们以获得这个(或功能性 multi-indexed 数据框):
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 列时,它出于某种原因删除了所有其他 (non-renamed) 列。我还尝试读取仅包含顶部 header 行(如 single-indexed)的 multi-indexed csv,将两者合并在一起,然后生成结果 multi-indexed。在我 运行 进入重命名问题之前,这似乎一直有效。
我尝试先将 single-indexed 数据框转换为 multi-indexed 数据框,
提前致谢!
您可以使用 merge
with drop
列 ('A', 0)
:
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
通过评论编辑 - 使用 get_level_values
:
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
EDIT1:如果您需要合并多列:
print (mi)
A B C
AA BB1 BB2 CC
0 1 text 5 7
1 2 text2 6 8
2 3 text3 7 9
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 1
1 text2 T2 2
2 text3 T3 3
df = (pd.merge(mi,si, left_on=[('B','BB1'),('A','AA')], right_on=[('A', 0), ('E', 2)])
.drop([('A', 0), ('E', 2)], axis=1))
print (df)
A B C D
AA BB1 BB2 CC 1
0 1 text 5 7 T1
1 2 text2 6 8 T2
2 3 text3 7 9 T3