【问题标题】:Sort by index and column按索引和列排序
【发布时间】:2020-02-07 15:32:13
【问题描述】:

我正在尝试按索引和列进行排序,但无济于事。

部分数据集

            ID         Element  Data_Value
Date            
2005-01-01  USW00004848 TMIN    0
2005-01-01  USC00207320 TMAX    150
2005-01-01  USC00207320 TMIN    -11
2005-01-01  USW00014833 TMIN    -44
2005-01-01  USW00014833 TMAX    33

索引列

DatetimeIndex(['2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01', '2005-01-01',
               ...
               '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',
               '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',
               '2015-12-31', '2015-12-31'],
              dtype='datetime64[ns]', name='Date', length=165002, freq=None)

我的尝试

df2 = df2.rename_axis(df2.index).sort_values(by = [df2.index, 'ID'], ascending = [False, True])

上面的输出: ValueError: 新名称的长度必须为 1,得到 165002

df2 = df2.rename_axis("Date").sort_values(by = ["Date", "ID"], ascending = [False, True])

上面的输出: KeyError: 'Date'

df2 = df2.sort_values(by = [df2.index, 'ID'], ascending = [False, True]) 

上面的输出: KeyError: "DatetimeIndex(['2005-01-01', '2005-01-01', '2005-01-01' , '2005-01-01',\n '2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',\n '2005-01- 01', '2005-01-01',\n ...\n '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31', \n '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',\n '2015-12-31', '2015-12-31 '],\n dtype='datetime64[ns]', name='Date', length=165002, freq=None) 不在索引中"

df2 = df2.sort_values(by = ["Date", "ID"], ascending = [False, True])

上面的输出: KeyError: 'Date'

df2 = df2.sort_values(by = [df2.index.Date, 'ID'], ascending = [False, True]) 

上面的输出: AttributeError: 'DatetimeIndex' object has no attribute 'Date'

【问题讨论】:

  • 你的熊猫版本是什么?因为最后它工作得很好。
  • @jezrael '0.19.2' 这是一个课程作业,在他们指定的服务器环境上完成。
  • 为它添加了解决方案。

标签: python pandas sorting datetime datetimeindex


【解决方案1】:

在上一个 pandas 版本 0.23+ 这很好用:

print (df2.index)
DatetimeIndex(['2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01'],
              dtype='datetime64[ns]', name='Date', freq=None)


df2 = df2.sort_values(by = ["Date", "ID"], ascending = [False, True])
print (df2)
                     ID Element  Data_Value
Date                                       
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207320    TMIN         -11
2005-01-01  USW00004848    TMIN           0
2005-01-01  USW00014833    TMIN         -44
2005-01-01  USW00014833    TMAX          33

在一些较旧的 pandas 版本中也适用的另一种解决方案是将 DatetimeIndex 转换为列优先,排序并转换回:

df2 = (df2.reset_index()
          .sort_values(by = ["Date", "ID"], ascending = [False, True])
          .set_index('Date'))

感谢@Alexander 提供替代方案:

df2 = (df.set_index('ID', append=True)
         .sort_index(ascending=[False, True])
         .reset_index('ID'))

print (df2)
                     ID Element  Data_Value
Date                                       
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207320    TMIN         -11
2005-01-01  USW00004848    TMIN           0
2005-01-01  USW00014833    TMIN         -44
2005-01-01  USW00014833    TMAX          33

【讨论】:

  • 或者,df.set_index('ID', append=True).sort_index(ascending=[False, True]).reset_index('ID')
猜你喜欢
  • 2023-03-30
  • 2016-01-16
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2012-02-14
  • 2014-09-17
相关资源
最近更新 更多