这里有一个虚拟数据框:
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']})
答案 0 :(得分:2)
在传递给MultiIndex.from_product
的MultiIndex.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!
表示Name
,Type
中有重复的对,用于处理数据的解决方案是:
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