如何在熊猫数据框中找到缺失对并填充虚拟值

时间:2020-10-26 12:23:47

标签: python 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']})

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

插入行

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

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

作为总结,我需要做的是---

找到两列缺失的对,并用一个虚拟值填充另一特定行。

编辑---由于在以下解决方案中发现了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']})

1 个答案:

答案 0 :(得分:2)

在传递给MultiIndex.from_productMultiIndex.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)
                 Date
Name Type            
A    X     2019-08-06
     Y     2019-08-08
     Z     0000-00-00
B    X     0000-00-00
     Y     2019-08-01
     Z     0000-00-00
C    X     0000-00-00
     Y     0000-00-00
     Z     2019-10-12
     

编辑:错误ValueError:cannot handle a non-unique multi-index!表示NameType中有重复的对,用于处理数据的解决方案是:

df = 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 col
0  2019-08-06    A    X   a
1  2019-08-08    A    X   b <-duplicated pair `A, X` - Name, Type
2  2019-08-01    B    Y   c
3  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      col
0    A    X  2019-08-06        a
1    A    Y  0000-00-00  missing
2    A    Z  0000-00-00  missing
3    B    X  0000-00-00  missing
4    B    Y  2019-08-01        c
5    B    Z  0000-00-00  missing
6    C    X  0000-00-00  missing
7    C    Y  0000-00-00  missing
8    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      col
0    A    X  2019-08-06        a
1    A    X  2019-08-08        b
2    A    Y  0000-00-00  missing
3    A    Z  0000-00-00  missing
4    B    X  0000-00-00  missing
5    B    Y  2019-08-01        c
6    B    Z  0000-00-00  missing
7    C    X  0000-00-00  missing
8    C    Y  0000-00-00  missing
9    C    Z  2019-10-12        d