Lambda Apply: ссылка на другие строки и столбцы

Я пытаюсь изменить значения данного столбца в моем наборе данных на основе значений вокруг данной ячейки. Рассмотрим следующие данные:

Data = {'Col1': [5593 , 5114 , 6803 , 2175 , 2175] , 'Col2': [2879 , 1176 , 7114 , 8677 , 0]}
df = pd.DataFrame(data = Data)
df.head()

Col1    Col2
0   5593    2879
1   5114    1176
2   6803    7114
3   2175    8677
4   2175    0

Я создаю новый столбец для хранения новых значений:

Data['Col3'] = Data['Col2']

Я хочу сделать функцию применения - лямбда, которая делает следующее: Если Col3 равен нулю, а предыдущее значение Col1 равно текущему значению Col1, то есть: (x.shift(-2, -1) == x.shift(-2, 0), то фактическое значение Col3 должно быть предыдущее значение Col2, т. е. x.shift(-1 , -1), иначе значение Col3 не должно меняться.

Я пробовал что-то вроде следующего (псевдокод):

df['Col3'] = df['Col3'].apply(lambda x: x.shift(-1 , -1) if (x == 0 and x.shift(-2 , -1) == x.shift(-2, 0)) else x)

Для этого конкретного подмножества моих данных это должно выглядеть следующим образом:

Col1    Col2    Col3
0   5593    2879    2879
1   5114    1176    1176
2   6803    7114    7114
3   2175    8677    8677
4   2175    0       8677

Я не уверен, что сдвиг является правильным методом для использования (серия содержит NaN), но, надеюсь, идея ясна.

Мой реальный набор данных очень большой, поэтому я хочу, чтобы операции выполнялись хорошо со многими строками.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
694
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC, вы можете использовать np.where со сдвинутыми столбцами:

df['Col3'] = np.where(df['Col1'].shift().eq(df['Col1']), df['Col2'].shift(), df['Col2'])
print(df)

Выход

   Col1  Col2    Col3
0  5593  2879  2879.0
1  5114  1176  1176.0
2  6803  7114  7114.0
3  2175  8677  8677.0
4  2175     0  8677.0

Ниже пошагово, объяснение с комментариями:

# create a mask, where is True if the consecutive values in Col1 are equal
mask = df['Col1'].shift().eq(df['Col1'])

# choose between the shifted Col2 (the previous value) and Col2 using the mask
df['Col3'] = np.where(mask, df['Col2'].shift(), df['Col2'])

print(df)

Это прекрасно работает, если значение появляется в первой строке! Есть ли способ расширить код так, чтобы он также проверял те же условия, но и для строки ниже? В моей терминологии это будет shift(1 , 1)

Amby95 22.12.2020 22:05

@ Amby95 Не могли бы вы добавить небольшой пример, когда это не работает?

Dani Mesejo 22.12.2020 22:06

Если бы вы переключили индекс 3 и 4 в первом выводе, у вас был бы именно тот случай, о котором я говорю. Затем он все равно должен проверить, находится ли одно и то же значение в строке выше или ниже, и если это так, то должна быть выполнена та же процедура.

Amby95 28.12.2020 10:11

Другие вопросы по теме