python - 为什么转置数据以获得多索引数据帧?

标签 python pandas dataframe multi-index

当从 DataFrame 创建多索引 DataFrame 时,我对数据方向有点困惑。 我使用 read_excel() 导入数据,并从以下内容开始:

import pandas as pd
df = pd.DataFrame([['A', 'B', 'A', 'B'], [1, 2, 3, 4]],
columns=['k', 'k', 'm', 'm'])
df

Out[3]: 
   k  k  m  m
0  A  B  A  B
1  1  2  3  4

我想对其进行多重索引并获取:

   A  B  A  B
   k  k  m  m
0  1  2  3  4

主要来自 Pandas 的文档,我做了:

arrays = df.iloc[0].tolist(), list(df)
tuples = list(zip(*arrays))
multiindex = pd.MultiIndex.from_tuples(tuples, names=['topLevel', 'downLevel'])
df = df.drop(0)

如果我尝试

df2 = pd.DataFrame(df.values, index=multiindex)
(...)
ValueError: Shape of passed values is (4, 1), indices imply (4, 4)

然后我必须转置这些值:

df2 = pd.DataFrame(df.values.T, index=multiindex)
df2
Out[11]: 
                    0
topLevel downLevel   
A        k          1
B        k          2
A        m          3
B        m          4

最后我重新转置此数据框以获得:

df2.T
Out[12]: 
topLevel   A  B  A  B
downLevel  k  k  m  m
0          1  2  3  4

好吧,这就是我想要的,但我不明白为什么我必须转置两次。好像没什么用。

最佳答案

您可以自己创建MultiIndex,然后删除该行。从您的起始 df 开始:

import pandas as pd

df.columns = pd.MultiIndex.from_arrays([df.iloc[0], df.columns], names=[None]*2)
df = df.iloc[1:].reset_index(drop=True)

   A  B  A  B
   k  k  m  m
0  1  2  3  4

关于python - 为什么转置数据以获得多索引数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635870/

相关文章:

python - Heroku:S3/boto3 - 错误:请使用 AWS4-HMAC-SHA256

python - 如何在pandas中没有聚合函数的情况下对列进行分组?

python - 对Python中数据帧的每个元素应用相同的计算

Python/Pandas if 语句和索引

在循环中跨列替换多个值

python - py2neo连接错误(认证错误)

python - 如何在 Django Rest 框架中允许无需身份验证即可访问基本路由

python - 如何将字典存储为单独的文件,并在 python 脚本中读取文件以使用变量

python - 将 (df.info) 方法输出存储在 DataFrame 或 CSV 中

Python:将列中的 "NA"替换为另一列的相应行值中的值(反之亦然)