转置数据框中除第一列以外的所有列

Transposing all but the first column in a dataframe

我得到了以下数据框

df = pd.DataFrame({'ISIN': ['A', 'B', 'C'], 
                   'Jan': [40000, 50000, 42000],
                   'Feb': [40000, 50000, 42000],
                   'Mar': [40000, 50000, 42000]})

产生

   ISIN Jan   Feb    Mar
0  A    40000 50000  42000
1  B    40000 50000  42000
2  C    40000 50000  42000

我正在尝试生成数据如下所示的输出:

   Date     A    B      C
0  Jan    40000 40000  40000
1  Feb    50000 50000  50000
2  Mar    42000 42000  42000

我的第一遍是使用

简单地转置分析
df = df.T

除了 ISIN 行(即我想要的列 headers)仍然位于数据集中之外,这种方法有效:

           0     1      2
  ISIN     A     B      C
  Jan    40000 40000  40000
  Feb    50000 50000  50000
  Mar    42000 42000  42000

然后我尝试在进行转置之前弹出 ISIN 行,即

ISIN = df.pop('ISIN') df = df.T

这去掉了 ISIN 行,但是当我尝试插入弹出的列(使用 df.insert)并更改轴时...我卡住了

我也尝试过使用 df.melt,但我很难在正确的地方找到正确的东西

我相信这很容易,但我在这里兜圈子,我真的很感激一些智慧。

谢谢!

当您转置 DataFrame 时,您还交换了索引和列。所以你必须明确地设置索引:

df = df.set_index('ISIN').T.reset_index()

您将获得:

ISIN index      A      B      C
0      Jan  40000  50000  42000
1      Feb  40000  50000  42000
2      Mar  40000  50000  42000

值正确,但标签不正确。您可以使用 rename_axis:

修复它们
df = df.set_index('ISIN').T.rename_axis('Date').reset_index().rename_axis(None, axis=1)

你得到了预期的结果:

  Date      A      B      C
0  Jan  40000  50000  42000
1  Feb  40000  50000  42000
2  Mar  40000  50000  42000

转置时索引变成列,列索引,所以需要先设置ISIN为索引再转置

import pandas as pd

df = pd.DataFrame({'ISIN': ['A', 'B', 'C'], 
                   'Jan': [40000, 50000, 42000],
                   'Feb': [40000, 50000, 42000],
                   'Mar': [40000, 50000, 42000]})
df.set_index('ISIN', inplace=True)
print(df.T)

产生:

ISIN      A      B      C
Jan   40000  50000  42000
Feb   40000  50000  42000
Mar   40000  50000  42000

你可以试试:

df.rename(columns={'ISIN': 'Date'}).set_index('Date').T

结果:

Date      A      B      C
Jan   40000  50000  42000
Feb   40000  50000  42000
Mar   40000  50000  42000