Предполагая, что ваш исходный фрейм данных df
, вы должны сначала использовать crosstab
и reset_index
для построения полного списка ожидаемых строк:
df2 = pd.DataFrame(pd.crosstab(df['Date Opened'], df['Part Number']
).stack()).reset_index()[['Date Opened', 'Part Number']]
это дает:
Date Opened Part Number
0 2019-01-14 PartB
1 2019-01-14 PartC
2 2019-01-14 partA
3 2019-01-21 PartB
4 2019-01-21 PartC
5 2019-01-21 partA
6 2019-01-28 PartB
7 2019-01-28 PartC
8 2019-01-28 partA
Неправильно упорядочено, потому что нижний регистр p
идет после верхнего P
в последовательности упорядочения. Вы можете исправить это, отсортировав по последнему символу номера детали:
df2 = df2.assign(ix=df2['Part Number'].str[-1]).sort_values(['Date Opened', 'ix']
)[['Date Opened', 'Part Number']].reset_index(drop=True)
Теперь вы можете объединить исходные значения, заполнить недостающие значения 0 и привести к int:
df2.merge(df, how='left', on = ['Date Opened', 'Part Number']).fillna(0).astype({'NCe': int})
чтобы получить:
Date Opened Part Number NCe
0 2019-01-14 partA 1
1 2019-01-14 PartB 0
2 2019-01-14 PartC 0
3 2019-01-21 partA 0
4 2019-01-21 PartB 2
5 2019-01-21 PartC 1
6 2019-01-28 partA 0
7 2019-01-28 PartB 3
8 2019-01-28 PartC 0