Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex

Posted

技术标签:

【中文标题】Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex【英文标题】:Pandas Merge SingleIndex to MultiIndex from CSV 【发布时间】:2016-09-18 20:01:31 【问题描述】:

鉴于 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

在熊猫中:

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

在熊猫中:

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(效果很好),然后与多索引数据框合并,但也没有用。

提前致谢!

【问题讨论】:

在第一级列DE可以是CCCC? 很遗憾没有。但它们可以是其他任何东西(偶数,根据您之前在这篇文章中链接的解决方案)。 【参考方案1】:

您可以将mergedrop('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

【讨论】:

谢谢!顺便说一句,如果我希望 si 中的底部列集与顶部相同(即 0 级 = 'A'、'D'、'E' 和 1 级 = 'A'、'D', 'E' ),以复制顶部标题的方式? 太棒了!还有一件事;如果我需要加入多个列怎么办?我试过 right_on=[(col1,col1),(col2,col2)] 但没有运气。 对不起,我打错了。 没问题。 ;) 祝你好运!并感谢大家的接受。

以上是关于Pandas 将 CSV 中的 SingleIndex 合并到 MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章

如何将 csv 字符串转换为 pandas 中的列表?

如何将 csv 字符串转换为 pandas 中的列表?

如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?

如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?

Python:将列表写入 Pandas 中的列

pandas使用read_csv函数读取csv数据设置parse_dates参数将csv数据中的指定字段数据列解析为时间日期对象