【问题标题】:Sorting a Pandas Pivot Containing Strings对包含字符串的 Pandas Pivot 进行排序
【发布时间】:2016-11-10 17:13:06
【问题描述】:

我有一个pandas.DataFrame,其中包含数值、日期值和文本值。像这样的:

    Strike  StrikeCell                                      Expiration  ExpirationCell                                  CellContents
0   60.0    \n <div class="cell row-header strike itm" ...  2016-07-15  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="60.0" m...
1   60.0    \n <div class="cell row-header strike itm" ...  2017-01-20  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="60.0" m...
2   60.0    \n <div class="cell row-header strike itm" ...  2018-01-19  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="60.0" 
13  70.0    \n <div class="cell row-header strike itm" ...  2017-01-20  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="70.0" m...
15  70.0    \n <div class="cell row-header strike itm" ...  2018-01-19  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="70.0" m...
17  70.0    \n <div class="cell row-header strike itm" ...  2016-10-21  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="70.0" m...
...
562 260.0   \n <div class="cell row-header strike otm" ...  2017-01-20  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="260.0" ...
564 270.0   \n <div class="cell row-header strike otm" ...  2017-01-20  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="270.0" ...
565 280.0   \n <div class="cell row-header strike otm" ...  2017-01-20  \n <div class="cell col-header expiration">...  \n <div class="cell option" strike="280.0" ...

我的意图是将StrikeCell 放在第一列下方(按升序排列),将ExpirationCell 放在各列中(按升序排列),将CellContents 作为表格中的值。基本上我正在创建一个带有 html 格式内容的大型数据透视表。

我可以做以下工作正常:

df.pivot(index='Strike', columns='Expiration', values='CellContents')

Strike 排序正确,Expiration 排序正确。

但是,如果我尝试使用字符串内容StrikeCellExpirationCell 如下:

df.pivot(index='StrikeCell', columns='ExpirationCell', values='CellContents')

排序丢失。

所以问题是如何在将StrikeCell 用作indexExpirationcell 用作columns 的同时重新获得StrikeExpiration 的升序排序。

使用pandas 0.18.1

【问题讨论】:

  • 它看起来像一些其他问题,因为如果使用这个测试df,它排序正确:df = pd.DataFrame({'StrikeCell':['f','e','c','d','a','b'], 'ExpirationCell':['c','a','b','a','a','b'], 'CellContents':['a','b','c','a','a','b']})
  • 我在测试时也注意到了类似的情况。有人知道默认排序吗?
  • 我不确定,但字母数字可以是默认排序。
  • 这应该会恢复您的初始订购:pivoted_df.reindex(index=df.StrikeCell, columns=df.ExpirationCell)。 HTH
  • 谢谢,但这并没有解决。

标签: python-2.7 sorting pandas pivot


【解决方案1】:

我相信这应该适合你。

首先让我们确定ExpirationCellStrikeCell 的订单。

StrikeCell_ordered = df[['Strike', 'StrikeCell']].sort_values(by='Strike')['StrikeCell']
ExpirationCell_ordered = df[['Expiration', 'ExpirationCell']].sort_values(by='Expiration')['ExpirationCell']

然后旋转并应用reindex

pivoted_df = df.pivot(index='StrikeCell', columns='ExpirationCell', values='CellContents')
result = pivoted_df.reindex(index=StrikeCell_ordered, columns=ExpirationCell_ordered)

【讨论】:

  • 我必须将drop_duplicates 方法添加到StrikeCell_orderedExpirationCell_ordered,否则它会旋转重复的StrikeCells 和ExpirationCells。这样做很有效。谢谢!
  • @strimp099 对,我忘了重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2019-12-18
  • 2020-09-09
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多