如何在保留索引和重命名键的同时转置pandas数据帧

时间:2016-07-08 17:50:26

标签: python numpy pandas dataframe

这就是我所拥有的:

df: 
         A    B    C    D
0 foo    1    3    5    7
1 moo    2    4    6    8
2 poo    3    5    7    9

我想要的是什么:

df_Transposed:
         foo    moo   poo 
0    A    1      2     3
1    B    3      4     5
2    C    5      6     7
3    D    7      8     9

我试过了transpose(),但我的钥匙成了否定的范围。列。我希望密钥成为['foo', 'moo', 'poo']。我希望我的索引与df中的索引保持一致。

不要假设方阵,这是一个索引帧。

5 个答案:

答案 0 :(得分:2)

您可以进行转置,然后使用droplevel删除额外的列级

result.columns = result.columns.droplevel(0)

并使用set_index添加新的索引级别:

result = result.set_index([np.arange(len(result)), result.index])

例如,

import pandas as pd

index = pd.MultiIndex.from_tuples([(0, 'foo'), (1, 'moo'), (2, 'poo')])
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [3, 4, 5],
                   'C': [5, 6, 7],},
                  index=index)

result = df.T
result.columns = result.columns.droplevel(0)
result = result.set_index([np.arange(len(result)), result.index])
print(result)

打印

     foo  moo  poo
0 A    1    2    3
1 B    3    4    5
2 C    5    6    7

答案 1 :(得分:1)

一个班轮(和粗略)

df.reset_index(0, drop=True).T.set_index([range(len(df.columns))], append=True).swaplevel(0, 1)

较少毛重

df1 = df.reset_index(0, drop=True).T
idx = pd.MultiIndex.from_tuples(
    zip(range(len(df1)), df1.index.tolist())
)
df1 = df1.set_index(idx)
df1

两者都产生

enter image description here

答案 2 :(得分:1)

您可以采取类似于piRSquared的答案,但采用不同的方式更改索引。

df1 = df.reset_index.(0, drop=True).T
df1.index = pd.MultiIndex.from_tuples([(i,x) for i,x in enumerate(df1.index)])

这适用于非方形的数据帧以及方形的数据帧。

答案 3 :(得分:1)

这有点奏效,我找不到从multiIndex中删除标签([' level_0',' index'])的方法。

    df3 = df.reset_index(0, drop=True).T.reset_index().reset_index()
    df3 = df3.set_index(['level_0', 'index'])
    df3

                       foo  moo  poo
     level_0 index               
       0       A        1    2    3
       1       B        3    4    5
       2       C        5    6    7
       3       D        7    8    9

df3.info()

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 4 entries, (0, A) to (3, D)
Data columns (total 3 columns):
foo    4 non-null int64
moo    4 non-null int64
poo    4 non-null int64
dtypes: int64(3)
memory usage: 128.0+ bytes

答案 4 :(得分:1)

我能够以另一种方式做到这一点。这是我的代码。转置后:

df.columns = df.iloc[0]
df = df.reset_index()
df = df.drop(df.index[0])
df = df.reset_index()
df =df.drop(["level_0","index"],axis = 1)