【问题标题】:Advanced MultiIndex sorting and indexing高级 MultiIndex 排序和索引
【发布时间】:2018-12-12 15:35:45
【问题描述】:

我有一个超过 100k 行的数据,我需要有效地将其从左侧 DataFrame 重新组合到多索引右侧,其中索引按第三列中的值总和排序,每个索引内的第二列值排序为第 3 列中的值。所有排序都是降序的。

我不知道如何正确地做到这一点,并且已经花了一整天的时间弄清楚了。

 a   b  c           a sum b  c  %
foo one 1          foo 5 one 3 3/5
foo two 2                two 2 2/5
bar one 1    =>    baz 4 two 3 3/4
baz one 1                one 1 1/4
baz two 3          bar 3 six 2 2/3
foo one 2                one 1 1/3
bar six 2           

更新: @jezrael 给出的代码效果很好,但它以这种方式输出:

                  %
a   sum b   c      
foo 5   one 3  0.60
        two 2  0.40
        six NaN NaN
baz 4   two 3  0.75
        one 1  0.25
        six NaN NaN
bar 1   one 1  1.00
        two NaN NaN
        six NaN NaN

是否可以用 NaN 去掉这些字符串?

更新 #2: 我发现了导致 NaN 问题的问题。这是由 'category' 数据类型引起的。我不知道它如何影响代码的行为。只是指出原因。

【问题讨论】:

    标签: python pandas sorting indexing


    【解决方案1】:

    我认为需要:

    #aggregate sum by a, b columns
    df = df.groupby(['a','b'], as_index=False)['c'].sum()
    print (df)
         a    b  c
    0  bar  one  1
    1  baz  one  1
    2  baz  two  3
    3  foo  one  3
    4  foo  two  2
    
    #create new column by position with transform sum per a column
    df.insert(1, 'sum', df.groupby('a')['c'].transform('sum'))
    #division of columns
    df['%'] = df['c'].div(df['sum'])
    print (df)
         a  sum    b  c     %
    0  bar    1  one  1  1.00
    1  baz    4  one  1  0.25
    2  baz    4  two  3  0.75
    3  foo    5  one  3  0.60
    4  foo    5  two  2  0.40
    
    #sorting by multiple columns and create MultiIndex  
    df = df.sort_values(['sum','c'], ascending=False).set_index(['a','sum','b', 'c'])
    print (df)
                      %
    a   sum b   c      
    foo 5   one 3  0.60
            two 2  0.40
    baz 4   two 3  0.75
            one 1  0.25
    bar 1   one 1  1.00
    

    【讨论】:

    • 感谢您这么快的回复。它似乎正在工作。现在我需要了解引擎盖下发生了什么。你能推荐任何资料来阅读这些事情吗?似乎谷歌搜索和阅读文档对我来说效果不佳。再次感谢您。
    • @yol - 当然,在 pandas 中的文档非常好 tutorials,我特别喜欢 modern pandas
    • @yol - 如果我的回答有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记,将其从灰色切换为已填充。谢谢。
    • 我重新创建了示例 DataFrame,它工作得很好,而我的真实数据仍然给我这些 NaN。这意味着您的代码可以完美运行,问题出在我的数据上。现在我必须明白它是什么。附言工作 df 的输出:{'%': {('foo', 5, 'one', 3): 0.6, ...}} 真实数据的输出非常大,但除了有这些之外似乎具有相同的模式南斯。附言正如我之前提到的,Pandas v.0.23
    • 是的,我已经这样做了。实际上我取消了对category 的转换,这是为了优化内存使用。
    猜你喜欢
    • 2016-11-28
    • 2021-03-12
    • 2019-06-13
    • 2021-03-27
    • 2017-10-16
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多