Pandas добавляет новый столбец с groupby на основе значений в 3 разных столбцах

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий df:

     Document    Date    Schedule    Quantity    Key
0   123      2020-12-02    1          20         1
1   123      2020-12-02    2          10         0
2   123      2020-12-02    3           5         0
3   456      2020-12-02    4          10         0
 

Я хочу добавить новый столбец: сгруппированный по документу и дате, если количество в строке 0 (где Key = 1) отличается от количества в столбце с наименьшим значением в расписании (исключая строку 0) и где key = 0, New_Col = 1. Если количества одинаковы, New_Col = 0.

Желаемый результат:

     Document    Date    Schedule    Quantity    Key   New_Col
0   123      2020-12-02    1          20         1       1
1   123      2020-12-02    2          10         0       0
2   123      2020-12-02    3           5         0       0
3   456      2020-12-02    4          10         0       0
 

Ответ №1:

Определите следующую функцию:

 def getNewCol(grp):
    rv = pd.Series(0, index=grp.index)
    # Quantity from row with Key == 1 (a Series)
    qn = grp.query('Key == 1').Quantity
    if qn.size == 0:   # Nothing found
        return rv
    qnK1 = qn.iloc[0]  # The Quantity itself
    # Min Schedule from "other" rows
    schMin = grp.query('Key != 1').Schedule.min()
    # Quantity from this row
    qnMin = grp.query('Schedule == @schMin').Quantity.iloc[0]
    if qnK1 != qnMin:  # Different
        rv.iloc[0] = 1 # Set the first element of the result
    return rv
 

Затем примените его и сохраните результат в новом столбце:

 df['New_Col'] = df.groupby(['Document', 'Date'], as_index=False)
    .apply(getNewCol).reset_index(level=0, drop=True)
 

Результат:

    Document       Date  Schedule  Quantity  Key  New_Col
0       123 2020-12-02         1        20    1        1
1       123 2020-12-02         2        10    0        0
2       123 2020-12-02         3         5    0        0
3       456 2020-12-02         4        10    0        0
 

Комментарии:

1. Спасибо, к сожалению, это не работает. Это дает мне New_Col = 1 только для уникальных комбинаций Document amp; Date. Я хотел бы видеть New_Col = 1 каждый раз, когда в следующей строке тот же документ, та же дата, расписание 1 из предыдущей строки, другое количество из предыдущей строки и ключ = 0

2. Действительно, я пропустил деталь, что вы хотите найти строку с наименьшим значением в расписании (из «других» строк) и из этой строки взять количество для сравнения. Теперь я исправил решение и добавил несколько комментариев.