【问题标题】:How to sort values in a MultiIndex pandas dataframe?如何对 MultiIndex pandas 数据框中的值进行排序?
【发布时间】:2023-04-03 13:02:01
【问题描述】:

我有一个带有 MultiIndex 的 pandas DataFrame。我想对列的值进行排序,并比较索引 level0 中的值。如果值为最大值,则id应为1,如果值为secondary,则id应为2。最后输出其排序后的id。

例如:

arrays = [['bar', 'bar','bar', 'baz', 'baz', 'foo', 'foo','foo', 'foo','qux', 'qux'],
      ['one', 'two', 'three','one', 'two', 'one', 'two','three', 'four',  'one', 'two']]
df = pd.DataFrame(np.random.randn(11), index=arrays,columns=['values'])
df

输出:

            values
bar one     -1.098567
    two     -0.936011
    three   -0.654245
baz one     -0.637409
    two     -0.439939
foo one      0.238114
    two      1.146573
    three   -0.512294
    four    -0.611913
qux one     -0.481083
    two      0.515961

最后,我想要这个:

            values      sort
bar one     -1.098567      3
    two     -0.936011      2
    three   -0.654245      1
baz one     -0.637409      2
    two     -0.439939      1
foo one      0.238114      2
    two      1.146573      1
    three   -0.512294      3
    four    -0.611913      4
qux one     -0.481083      2
    two      0.515961      1

【问题讨论】:

  • 你的意思是这样的吗:stackoverflow.com/questions/49264510/…
  • 附带说明,您可能希望避免将列命名为'values':它已经是一个允许您访问底层 NumPy 数组的属性
  • 您可能还想在使用np.random 时提供种子,以便其他人可以轻松地重新创建您的数据框值。
  • 谢谢,@BradSolomon

标签: python pandas


【解决方案1】:

在第一级(即 0 级)分组,然后按降序排列rank

>>> df.assign(sort=df.groupby(level=0).rank(ascending=False))
             values  sort
bar one   -1.098567     3
    two   -0.936011     2
    three -0.654245     1
baz one   -0.637409     2
    two   -0.439939     1
foo one    0.238113     2
    two    1.146573     1
    three -0.512295     3
    four  -0.611913     4
qux one   -0.481083     2
    two    0.515961     1

【讨论】:

  • 很棒...但有一件事是,当两个值相同时,输出将为 0.5。为什么?
  • 有不同的方法给出不同的行为。查看文档(我在问题中提供了链接)。这些方法是“平均”(这是默认值)以及“最小”、“最大”、“第一”和“密集”。
猜你喜欢
  • 2016-04-08
  • 2018-08-22
  • 1970-01-01
  • 2018-01-01
  • 2017-09-14
  • 2021-06-25
  • 1970-01-01
  • 2013-06-05
  • 2019-06-15
相关资源
最近更新 更多