首先由DataFrame.assign 创建新列,由1 填充,然后通过Series.unique 两列的值创建MultiIndex.from_product,在DataFrame.set_index 之后使用DataFrame.reindex - 可以为新附加行设置值colC 列由fill_value 参数:
mux = pd.MultiIndex.from_product([df['colA'].unique(),
df['colB'].unique()], names=['colA','colB'])
df1 = df.assign(colC = 1).set_index(['colA','colB']).reindex(mux, fill_value=0).reset_index()
print (df1)
colA colB colC
0 A A1 1
1 A C1 0
2 A B1 1
3 B A1 1
4 B C1 1
5 B B1 0
替代方案是使用DataFrame.set_index、Series.unstack 和DataFrame.stack 重塑:
df1 = (df.assign(colC = 1)
.set_index(['colA','colB'])['colC']
.unstack(fill_value=0)
.stack()
.reset_index(name='ColC'))
print (df1)
colA colB ColC
0 A A1 1
1 A B1 1
2 A C1 0
3 B A1 1
4 B B1 0
5 B C1 1
另一种解决方案是由itertools.product 创建新的DataFrame,DataFrame.merge 与indicator=True,重命名列并通过both 比较设置并将True/False 的整数转换为1/0 映射:
from itertools import product
df1 = pd.DataFrame(product(df['colA'].unique(), df['colB'].unique()), columns=['colA','colB'])
df = df1.merge(df, how='left', indicator=True).rename(columns={'_merge':'colC'})
df['colC'] = df['colC'].eq('both').astype(int)
print (df)
colA colB colC
0 A A1 1
1 A C1 0
2 A B1 1
3 B A1 1
4 B C1 1
5 B B1 0
如有必要,最后按DataFrame.sort_values 按两列添加排序:
df1 = df1.sort_values(['colA','colB'])