#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. Действительно, я пропустил деталь, что вы хотите найти строку с наименьшим значением в расписании (из «других» строк) и из этой строки взять количество для сравнения. Теперь я исправил решение и добавил несколько комментариев.