【问题标题】:Re-index to insert missing rows in a multi-indexed dataframe重新索引以在多索引数据框中插入缺失的行
【发布时间】:2018-05-12 18:36:57
【问题描述】:

我有一个具有三个索引级别的 MultiIndexed DataFrame。我想扩展我的第三级以包含给定范围内的所有值,但仅适用于两个较高级别中的现有值。 例如,假设第一级是名称,第二级是日期,第三级是小时。我希望所有 24 小时都有行(即使当前缺少一些),但仅限于已经存在的名称和日期。新行中的值可以用零填充。

所以一个简单的示例输入是:

>>> import pandas as pd
>>> df = pd.DataFrame([[1,1,1,3],[2,2,1,4], [3,3,2,5]], columns=['A', 'B', 'C','val'])
>>> df.set_index(['A', 'B', 'C'], inplace=True)
>>> df
       val
A B C     
1 1 1    3
2 2 1    4
3 3 2    5

如果 C 的所需值为 [1,2,3],则所需输出为:

       val
A B C     
1 1 1    3
    2    0
    3    0
2 2 1    4
    2    0
    3    0
3 3 1    0
    2    5
    3    0

我知道如何使用 groupby 并为每个组应用定义的函数来实现这一点,但我想知道是否有一种更简洁的方法来使用 reindex 来做到这一点(我不能让这个 one 用于 MultiIndex 案例,但也许我错过了什么)

【问题讨论】:

    标签: pandas


    【解决方案1】:

    使用 -

    partial_indices = [ i[0:2] for i in df.index.values ]
    C_reqd = [1, 2, 3]
    final_indices = [j+(i,) for j in partial_indices for i in C_reqd]
    index = pd.MultiIndex.from_tuples(final_indices, names=['A', 'B', 'C'])
    df2 = pd.DataFrame(pd.Series(0, index), columns=['val'])
    df2.update(df)
    

    输出

    df2
           val
    A B C
    1 1 1  3.0
        2  0.0
        3  0.0
    2 2 1  4.0
        2  0.0
        3  0.0
    3 3 1  0.0
        2  5.0
        3  0.0
    

    【讨论】:

    • 很好,谢谢! (还不能为我的声誉投票)
    猜你喜欢
    • 2019-06-24
    • 2020-04-16
    • 1970-01-01
    • 2016-06-13
    • 2019-01-11
    • 2019-05-16
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多