【问题标题】:Transposing all but the first column in a dataframe转置数据框中除第一列之外的所有列
【发布时间】:2020-02-24 16:23:22
【问题描述】:

我有以下数据框

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 行(即我想要的列标题)仍在数据集中:

           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 中,ISIN 是一列。尝试将其设置为索引,然后转置:df = df.set_index('ISIN').T
  • 谢谢。我显然是个笨蛋——但幸运的是你不是!!

标签: pandas transpose melt


【解决方案1】:

转置时,索引变成columns,columns index,所以需要先设置ISIN为index,然后再转置。

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

【讨论】:

    【解决方案2】:

    当您转置 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
    

    【讨论】:

      【解决方案3】:

      你可以试试:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 2013-10-04
        • 2012-09-06
        • 2012-12-03
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 2022-01-15
        相关资源
        最近更新 更多