【问题标题】:Transpose a Pandas dataframe around a column with many repeated entries围绕具有许多重复条目的列转置 Pandas 数据框
【发布时间】:2019-07-30 23:07:36
【问题描述】:

我创建了一个数据框,其中包含 10 年每个月末的 300 只股票的十几个属性(例如市盈率、市盈率)。数据框最初按月份索引(因此每个月有 300 个观察值),然后按股票代码(因此每个代码有 400 个观察值)。我的数据框有大约 12 列和 120,000 行。

我现在想转置数据框,使这些列成为股票代码,即大约有 300 列,每只股票一个。我希望日期继续与每一行相关联,这样我就有大约 4,800 行与一列中的每个代码相关联(12 个变量 x 400 个观察值)。

#Sort the dataframe, first by ticker and then by date, then write to Excel
DF.sort_values(by=['Date', 'ticker'], inplace=True)
DF.to_excel(outPath + outFn1)

#Now make ticker the index and sort by ticker and date 
DF = DF.reset_index().set_index('ticker')
DF.sort_values(by=['ticker', 'Date'], inplace=True)
DF.to_excel(outPath + outFn2)

#Now transpose the dataframe
DF = DF.reset_index().set_index('Date')
DF = DF.transpose()
DF.to_excel(outPath + outFn3)

不幸的是,当我执行最后一个 df.transpose() 时,我得到了 120,000 列和只有 12 行 - 300 个股票代码和 400 个月份被转换为 120,000 个列,月份(索引)显示在第一行!有没有办法只有 300 列(每个股票一个)和 4,800 行(每个变量每个月一个)?

非常感谢您的帮助

托马斯·飞利浦

【问题讨论】:

  • 你能给我们看一个数据的例子吗?
  • 日期cusip ticker bp pm12m1m 1986-12-31 00:00:00 037833100 aapl 0.8181818 1987-01-31 0.8181818 1987-01-31 0.8181818 1987-01-31 0.811818 1987-01-31 00:00:00 037833100 AAAPL 0.1996882 0.7513514 1987-02-28 00:00:00: 00 037833100 AAPL 0.158324 1.22
  • 日期cusip ticker bp pm12m1m 1986-12-31 00:00:00 037833100 aapl 0.8181818 1987-01-31 0.8181818 1987-01-31 0.8181818 1987-01-31 0.811818 1987-01-31 00:00:00 037833100 AAAPL 0.1996882 0.7513514 1987-02-28 00:00:00: 00 037833100 AAPL 0.158324 1.22

标签: pandas dataframe transpose


【解决方案1】:

假设您有一个看起来像这样的DataFrame - data

Feature              0         1    ...            6         7
Month Ticker                        ...                       
0     A       0.584049  0.701758    ...     0.724876  0.091812
      B       0.546022  0.554775    ...     0.381720  0.014467
      C       0.166254  0.810845    ...     0.848234  0.078745
      D       0.164278  0.409916    ...     0.472850  0.836136
      E       0.196801  0.556134    ...     0.451976  0.339668
1     A       0.336286  0.971672    ...     0.710570  0.344017
      B       0.449617  0.052413    ...     0.878496  0.404431
      C       0.383405  0.282608    ...     0.972533  0.957979
      D       0.328034  0.068577    ...     0.365409  0.158591
      E       0.846107  0.923831    ...     0.839615  0.890490
2     A       0.054455  0.427796    ...     0.528548  0.568229
      B       0.953295  0.567187    ...     0.035515  0.467428
      C       0.155837  0.810630    ...     0.512707  0.991404
      D       0.626261  0.268854    ...     0.919632  0.630014
      E       0.978789  0.578045    ...     0.155516  0.538323
3     A       0.641031  0.733028    ...     0.911317  0.210537
      B       0.341537  0.682774    ...     0.778101  0.017675
      C       0.574298  0.707269    ...     0.967428  0.319638
      D       0.577600  0.563917    ...     0.831466  0.053403
      E       0.732570  0.475240    ...     0.696523  0.417793

编辑:我刚刚意识到有一种更简单的方法可以做到这一点。

data.reset_index().set_index('Month').groupby('Month').apply(lambda g: g.set_index('Ticker').T)

就性能而言,两种解决方案都相似。虽然我在一个小数据集上进行测试。我认为在较大的 stack 上可能会受到伤害。

首先将其堆叠并重新索引:

stacked = data.stack().to_frame().reset_index().set_index(['Month', 'Feature'])

现在我们准备好了:

stacked.pivot(index=stacked.index, columns='Ticker')[0]

结果将如下所示:

Ticker                A         B         C         D         E
Month Feature                                                  
0     0        0.584049  0.546022  0.166254  0.164278  0.196801
      1        0.701758  0.554775  0.810845  0.409916  0.556134
      2        0.746143  0.996657  0.843376  0.739536  0.518822
      3        0.191602  0.274246  0.207361  0.739565  0.980208
      4        0.173600  0.095523  0.184685  0.869971  0.004018
      5        0.891771  0.508821  0.178942  0.423447  0.804024
      6        0.724876  0.381720  0.848234  0.472850  0.451976
      7        0.091812  0.014467  0.078745  0.836136  0.339668
1     0        0.336286  0.449617  0.383405  0.328034  0.846107
      1        0.971672  0.052413  0.282608  0.068577  0.923831
      2        0.769480  0.651071  0.322606  0.811118  0.321575
      3        0.527988  0.709826  0.254327  0.099533  0.117720
      4        0.240174  0.768326  0.689877  0.587520  0.162302
      5        0.287952  0.636137  0.557708  0.212823  0.832591
      6        0.710570  0.878496  0.972533  0.365409  0.839615
      7        0.344017  0.404431  0.957979  0.158591  0.890490
2     0        0.054455  0.953295  0.155837  0.626261  0.978789
      1        0.427796  0.567187  0.810630  0.268854  0.578045
      2        0.938299  0.821334  0.500624  0.037103  0.753389
      3        0.671038  0.202686  0.958819  0.793337  0.598762
      4        0.458506  0.371354  0.751473  0.624051  0.157371
      5        0.467098  0.884003  0.747713  0.771846  0.484238
      6        0.528548  0.035515  0.512707  0.919632  0.155516
      7        0.568229  0.467428  0.991404  0.630014  0.538323
3     0        0.641031  0.341537  0.574298  0.577600  0.732570
      1        0.733028  0.682774  0.707269  0.563917  0.475240
      2        0.847406  0.920411  0.017330  0.308168  0.311288
      3        0.882707  0.252812  0.663594  0.742554  0.648782
      4        0.134776  0.539955  0.825222  0.227707  0.215726
      5        0.291174  0.111133  0.645823  0.676221  0.753326
      6        0.911317  0.778101  0.967428  0.831466  0.696523
      7        0.210537  0.017675  0.319638  0.053403  0.417793

【讨论】:

  • 看起来我们正朝着正确的方向前进,但有些事情还不是正确的。如果我输入combinedDF.head()
  • 看来我们正朝着正确的方向前进,但还没有完全做到。如果我输入combinedDF.head(),我会得到一个简单的数据框,其中包含 Date(索引)、ticker、Feature0、Feature1、Feature 2 等列。如果我输入combinedDF.stack().to_frame().reset_index().set_index('Date'),我会得到三列:Date: level_1 和 0但是如果我现在输入stacked.pivot(columns = 'ticker'),我会得到一个KeyError,所以我不确定发生了什么。有人告诉我有一个 R 等价物:tapply(dat$Feature, list(dat$Date,dat$ticker),I),所以我们很可能在正确的轨道上,但还没有回家。
  • 奇怪的是,data.reset_index().set_index('Month').groupby('Month').apply(lambda g: g.set_index('Ticker').T) 的简单解决方案确实有效 - 非常感谢!我必须承认,我并不完全了解它的工作原理,但会继续努力。我已经在 Excel 中完成了最后一步 - 将月份添加到每一行。有没有办法在 Python 中执行此操作,以避免在 Excel 中进行任何进一步处理?
  • 你可以使用reset_index
猜你喜欢
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多