在熊猫数据框中插入“缺失”的多索引行

时间:2019-01-30 21:49:07

标签: python pandas multi-index

我有一个带有两级多索引的pandas DataFrame。第二级是数字的,应该针对第一级索引的每个唯一值进行排序和顺序排列,但存在空白。如何插入“缺失”行?样本输入:

import pandas as pd
df = pd.DataFrame(list(range(5)),
                  index=pd.MultiIndex.from_tuples([('A',1), ('A',3),
                                                   ('B',2), ('B',3), ('B',6)]),
                  columns='value')
#     value
#A 1      0
#  3      1
#B 2      2
#  3      3
#  6      4

预期输出:

#     value
#A 1      0
#  2    NaN
#  3      1
#B 2      2
#  3      3
#  4    NaN
#  5    NaN
#  6      4

我怀疑我可以使用resample,但是我无法将数字转换为类似日期的任何数字。

3 个答案:

答案 0 :(得分:2)

如果有意志,那就有办法。我对此并不感到骄傲,但是,我认为它可行。

尝试:

def f(x):
    levels = x.index.remove_unused_levels().levels
    x = x.reindex(pd.MultiIndex.from_product([levels[0], np.arange(levels[1][0], levels[1][-1]+1)]))
    return x

df.groupby(level=0, as_index=False, group_keys=False).apply(f)

输出:

     value
A 1    0.0
  2    NaN
  3    1.0
B 2    2.0
  3    3.0
  4    NaN
  5    NaN
  6    4.0

答案 1 :(得分:2)

经过深思熟虑,我自己提出了一个解决方案。从它多么糟糕的事实来看,我面临的问题不是一个非常典型的问题。

new_index = d.index.to_frame()\
                .groupby(0)[1]\
                .apply(lambda x:
                         pd.Series(1, index=range(x.min(), x.max() + 1))).index
d.reindex(new_index)

答案 2 :(得分:0)

您可以简单地使用以下取决于缺失的索引:

result.unstack(1).stack(0, dropna=False).fillna(0)

当您取消堆叠时,pandas 将 df 展开为具有行和列,在上面的示例中,1 级索引将是列名。然后,再次通过堆叠,您将 df 返回到其原始形式,但是,这次您需要确保使用 dropna=False 以便 NaN 值将在那里丢失索引。最后,使用 .fillna(0) 是可选的,这取决于您想对 NaN 值做什么。