繁体   English   中英

在熊猫中,如何在多索引的第 2 级重新索引(填充 0)

[英]In pandas, how to reindex(fill 0) in level 2 in multiindex

我有一个具有 2 级索引的数据框:月份和评级。 评级应该是 1,2,3(不要与列 1,2,3 混淆)。 我发现几个月来,评级可能会丢失。 例如,(人口和 2021-10)只有等级 1,2。 我需要每个月都有评级 1,2,3。 所以我需要为缺失的评分指数填写 0。 我该怎么做?

我试过 reindex([1,2,3],level='rating'),但不起作用。 我花了几个小时尝试。 请帮忙。 谢谢!

在此处输入图像描述

在此处输入图像描述

您可以使用pd.MultiIndex.from_product创建完整索引:

>>> df
                             1         2         3
(Population)       1  0.436954  0.897747  0.387058
                   2  0.464940  0.611953  0.133941
2021-08(Refreshed) 1  0.496111  0.282798  0.048384
                   2  0.163582  0.213310  0.504647
                   3  0.008980  0.651175  0.400103

>>> df.reindex(pd.MultiIndex.from_product(df.index.levels), fill_value=0)
                             1         2         3
(Population)       1  0.436954  0.897747  0.387058
                   2  0.464940  0.611953  0.133941
                   3  0.000000  0.000000  0.000000  # New record
2021-08(Refreshed) 1  0.496111  0.282798  0.048384
                   2  0.163582  0.213310  0.504647
                   3  0.008980  0.651175  0.400103

更新

我想知道df=df.reindex([1,2,3],level='rating',fill_value=0)不起作用,因为新的索引值 [1,2,3] 无法填充前一个的缺失值评级指数。 通过使用 from_product,它创建了两个索引的乘积。

事实上它有效。 我的意思是它有效果,但不是你所期望的。 该方法重新索引级别而不是 我来给你展示:

# It seems there is not effect because you don't see 3 and 4 as expected?
>>> df.reindex([1, 2, 3, 4], level='ratings')
                                   0         1         2
                   ratings                              
(Population)       1        0.536154  0.671380  0.839362
                   2        0.729484  0.512379  0.440018
2021-08(Refreshed) 1        0.279990  0.295757  0.405536
                   2        0.864217  0.798092  0.144219
                   3        0.214566  0.407581  0.736905

# But yes something happens
>>> df.reindex([1, 2, 3, 4], level='ratings').index.levels
FrozenList([['(Population)', '2021-08(Refreshed)'], [1, 2, 3, 4]])
                              The level has been reindexed ---^

# It's different from values
>>> df.reindex([1, 2, 3, 4], level='ratings').index.get_level_values('ratings')
Int64Index([1, 2, 1, 2, 3], dtype='int64', name='ratings')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM