【问题标题】:How do I create multi indexed series based on columns and range of values and check if it sorted properly?如何根据列和值范围创建多索引系列并检查它是否正确排序?
【发布时间】:2018-07-16 04:26:24
【问题描述】:

我创建了一个基于字母的系列:D、E、F,并以这种方式在每行从 0 到 9 插入值:

 df = pd.DataFrame({'letters': list('DDDDDDDDDDEEEEEEEEEEFFFFFFFFFF'), 'numbers': [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]})

  Output: 


  letters  numbers  
  0        D        0
  1        D        1
  2        D        2
  ....
  9        D        9
  10       E        0
  .....
  18       E        8
  19       E        9
  20       F        0
  ......
  28       F        8
  29       F        9

然后我用这段代码在这个 Df 上创建了多索引(我想检查这是正确的方法还是有其他方法来创建多索引)

  latestone = df.set_index(['letters', 'numbers'],drop=False)

output: 


                letters  numbers
 letters numbers                 
    D       0             D        0
            1             D        1
            ....
            9             D        9
    E       0             E        0
            1             E        1
            ...
            9             E        9
    F       0             F        0
            1             F        1
            ...
            9             F        9

基于此,或者是否有更好的方法来创建多索引,我想知道这些值是否按字典顺序排序(如果可能,为 True 或 False)。

另外,我想为字母 E 获取索引为 [2,5,7] 的行。

【问题讨论】:

  • 你想要一个与索引值相同的数据框吗?似乎没有必要。或者您只是对创建索引感兴趣?
  • @busybear 我试图这样做,但我得到了不同的结果,例如 [(D, 0), (D, 1), (D, 2), (D, 3), (D , 4), (D, 5), (D, 6), (D, 7), (D, 8), (D, 9), (E, 0), (E, 1), (E, 2 ), (E, 3), (E, 4), (E, 5), (E, 6), (E, 7), (E, 8), (E, 9), (F, 0), (F, 1), (F, 2), (F, 3), (F, 4), (F, 5), (F, 6), (F, 7), (F, 8), (F , 9)] 我不确定这个结果是否能帮助我得到我想要的解决方案。
  • 看起来确实像您想要的索引。每个元组中的第一个元素是索引的第一级,元组的第二个元素是索引的第二级。我提供了一个有效的答案。

标签: python python-3.x pandas multi-index


【解决方案1】:

您想知道的一件事是值是否已排序。否,值未排序。它们完全按照排列显示。

为了能够得到[2,5,7]你可以使用的行:

df.loc[[('E',2),('E',5),('E',7)]]
                letters  numbers
letters numbers                 
E       2             E        2
        5             E        5
        7             E        7

In [578]: df.loc[('E',[2,5,7])]
Out[578]: 
                letters  numbers
letters numbers                 
E       2             E        2
        5             E        5
        7             E        7

【讨论】:

  • 感谢@Onyambu 提供解决方案
  • 替代方案是df.loc[('E', [2, 5, 7]), :]
【解决方案2】:

要仅创建索引对象,pd.MultiIndex.from_product 在您的情况下会更容易。然后,您可以使用该索引创建具有所需值的数据框。

data = ...
mindex = pd.MultiIndex.from_product([list('DEF'), range(10)])
pd.DataFrame(data, index=mindex)

这不会更改顺序,但会按照您定义的顺序进行。使用sort_index 方法根据索引进行排序。您可以指定应首先排序的级别。

【讨论】:

  • 感谢@busybear 提供了创建多索引的新方法。
  • @Avi 您是要感谢这些用户,还是如果您的问题得到解决,您会接受答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2023-04-10
  • 2021-03-28
  • 2020-12-28
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多