如何在 pandas 数据框中找到缺失的一对并用虚拟值填充

这里我有一个虚拟数据框:


import pandas as pd


df = pd.DataFrame({'Date':[2019-08-06,2019-08-08,2019-08-01,2019-10-12], 'Name':['A','A','B','C'], 'Type':['X','Y','Y','Z']})

有 3 个潜在值Type--- W,X,Y,Z 我想找到缺失的一对Name-Type并用日期值'填充插入行0000-00-00'


因此,在此示例中,所有 A、B、C 都没有类型 W / B,C 没有 X / C 没有 Y / A,B 没有 Z


因此,我必须添加 8 行日期0000-00-00


总而言之,我需要做的是——


查找缺失的两列对,并用虚拟值填充其他特定行。


编辑 --- 由于我发现了具有以下解决方案的 ValueError,因此我编辑了虚拟数据框。


import pandas as pd


df = pd.DataFrame({'Date':[2019-08-06,2019-08-07,2019-08-08,2019-08-01,2019-10-12], 'Name':['A','A','A','B','C'], 'Type':['X','X','Y','Y','Z']})


宝慕林4294392
浏览 81回答 1
1回答

慕标5832272

使用MultiIndex.from_productby 列中所有组合的级别 byMultiIndex.levels传递到DataFrame.reindex:df = df.set_index(['Name','Type'])df = df.reindex(pd.MultiIndex.from_product(df.index.levels), fill_value='0000-00-00')print (df)                 DateName Type            A    X     2019-08-06     Y     2019-08-08     Z     0000-00-00B    X     0000-00-00     Y     2019-08-01     Z     0000-00-00C    X     0000-00-00     Y     0000-00-00     Z     2019-10-12     编辑:错误意味着,ValueError:cannot handle a non-unique multi-index!中存在重复对,处理数据的解决方案是:NameTypedf = pd.DataFrame({'Date':['2019-08-06','2019-08-08','2019-08-01','2019-10-12'],                    'Name':['A','A','B','C'],                    'Type':['X','X','Y','Z'],                    'col':list('abcd')})print (df)         Date Name Type col0  2019-08-06    A    X   a1  2019-08-08    A    X   b <-duplicated pair `A, X` - Name, Type2  2019-08-01    B    Y   c3  2019-10-12    C    Z   d解决方案是先通过 删除重复项DataFrame.duplicated,然后应用于reindex所有组合:mask = df.duplicated(['Name','Type'])df1 = df[~mask].set_index(['Name','Type'])df1 = (df1.reindex(pd.MultiIndex.from_product(df1.index.levels))          .fillna({'Date':'0000-00-00', 'col':'missing'}).reset_index())print (df1)  Name Type        Date      col0    A    X  2019-08-06        a1    A    Y  0000-00-00  missing2    A    Z  0000-00-00  missing3    B    X  0000-00-00  missing4    B    Y  2019-08-01        c5    B    Z  0000-00-00  missing6    C    X  0000-00-00  missing7    C    Y  0000-00-00  missing8    C    Z  2019-10-12        d最后添加所有重复的行concat:df = pd.concat([df1, df[mask]]).sort_values(['Name','Type'], ignore_index=True)print (df)  Name Type        Date      col0    A    X  2019-08-06        a1    A    X  2019-08-08        b2    A    Y  0000-00-00  missing3    A    Z  0000-00-00  missing4    B    X  0000-00-00  missing5    B    Y  2019-08-01        c6    B    Z  0000-00-00  missing7    C    X  0000-00-00  missing8    C    Y  0000-00-00  missing9    C    Z  2019-10-12        d
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python