【问题标题】:How to change a Pandas DataFrame into a column Multi-Index?如何将 Pandas DataFrame 更改为列多索引?
【发布时间】:2021-11-13 23:01:43
【问题描述】:

我有一个 Pandas DataFrame,其列索引如下所示:

+----+----+----+----+----+----+
|  A1|  A2|  A3|  B1|  B2|  B3|
+----+----+----+----+----+----+
...the data

我想做的就是把这个DataFrame的列索引改成多索引的,如下格式所示,不修改数据,只是简单的在索引中加一个上层(带值@ 987654323@ 和 B)。

+--------------+--------------+
|        A     |        B     |
+----+----+----+----+----+----+
|  A1|  A2|  A3|  B1|  B2|  B3|
+----+----+----+----+----+----+
...the data

我曾尝试使用pandas.MultiIndex function,但没有成功。怎么解决?

【问题讨论】:

  • 那么有必要使用pd.MultiIndex.from_arrays吗?不是df.columns = [df.columns.str[0], df.columns]

标签: python pandas dataframe multi-index


【解决方案1】:

最简单的是提取列的第一个值并在嵌套列表中分配回:

df = pd.DataFrame(0, columns=['A1','A2','A3','B1','B2','B3'], index=[0])

df.columns = [df.columns.str[0], df.columns]
print (df)
   A        B      
  A1 A2 A3 B1 B2 B3
0  0  0  0  0  0  0

如果需要从开头提取所有大写:

df = pd.DataFrame(0, columns=['ADa1','ADs2','AD3','B1','B2','B3'], index=[0])

df.columns = [df.columns.str.extract('(^[A-Z]+)', expand=False), df.columns]
print (df)

    AD           B      
  ADa1 ADs2 AD3 B1 B2 B3
0    0    0   0  0  0  0

如果需要设置列名也使用MultiIndex.from_arrays:

df = pd.DataFrame(0, columns=['ADa1','ADs2','AD3','B1','B2','B3'], index=[0])

df.columns = pd.MultiIndex.from_arrays([df.columns.str.extract('(^[A-Z]+)', expand=False), 
                                       df.columns], 
                                       names=('a','b'))
print (df)

a   AD           B      
b ADa1 ADs2 AD3 B1 B2 B3
0    0    0   0  0  0  0

【讨论】:

    【解决方案2】:

    您可以单独提取第一个字母并创建一个MultiIndex -

    multi_index_level_0 = [c[0] for c in df.columns]
    multi_index = [multi_index_level_0, df.columns.values]
    df.columns = pd.MultiIndex.from_arrays(multi_index)
    

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2021-07-20
      • 2022-01-10
      • 2016-05-03
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多