завершить серию (фрейм данных) в python - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть такой набор данных. Я хочу заполнить этот фрейм данных, как описано в выходных данных. В основном значения отсутствующих серий будут заполнены как ноль

 Date Opened     Part Number  NCe
0   2019-01-14    partA       1
1   2019-01-21    PartB       2
2   2019-01-21    PartC       1
3   2019-01-28    PartB       3

Вывод:

  Date Opened    Part Number  NCe
 2019-01-14      partA       1
 2019-01-14      PartB       0
 2019-01-14      PartC       0
 2019-01-21      PartA       0
 2019-01-21      PartB       2
 2019-01-21      PartC       1
 2019-01-28      PartA       0
 2019-01-28      PartB       3
 2019-01-28      PartC       0

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Предполагая, что ваш исходный фрейм данных 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
1 голос
/ 11 февраля 2020

Предполагая, что вы определили свой фрейм данных в переменной с именем 'df', вы можете проверить ниже, поможет ли это: -

  1. Сначала я создал каркасный фрейм данных, объединяющий все элементы из ваших двух столбцов вашего dataframe.
  2. Далее я просто соединил эти кадры данных в том порядке, в котором каркасный кадр данных образует основу вашего окончательного вывода. Просто заполните значения NaN '0', используя .fillna ().

    dates = df.Date_Opened.unique().tolist()

    parts = df.Part_Number.unique().tolist()

    index = pd.MultiIndex.from_product([dates, parts], names = ["Date_Opened", "Part_Number"])

    skeleton_df = pd.DataFrame(index = index).reset_index()

    final_df = pd.merge(skeleton_df, df, on=['Date_Opened','Part_Number'], how ='left').fillna(0)

Вывод

  Date_Opened Part_Number  NCe
0  2019-01-14       partA  1.0
1  2019-01-14       PartB  0.0
2  2019-01-14       PartC  0.0
3  2019-01-21       partA  0.0
4  2019-01-21       PartB  2.0
5  2019-01-21       PartC  1.0
6  2019-01-28       partA  0.0
7  2019-01-28       PartB  3.0
8  2019-01-28       PartC  0.0

Примечание: - Определенно есть лучшие способы решения, я опубликую обновление, как я может проверить другой.

...