вывести предыдущие строки по условию
Имеется фрейм данных:
import pandas as pd
import numpy as np
data = {'fruit': ['pear','pear','banana','banana', 'pear', 'pear','apple', 'apple', 'cherry','cherry'],
'fruit_type': ['unknown','pear','unknown','one', 'two', 'one','one', 'apple', 'cherry','unknown'],
'country': ['unknown','usa', 'unknown','usa', 'unknown','ghana','unknown', 'russia', 'albania','bolivia'],
'id': ['022','022','022', '011','011', '011','011', '011', '6','6'],
'month': ['unknown','march', 'unknown', 'october','october', 'january','july', 'unknown', 'january','unknown']
}
df = pd.DataFrame(data, columns = ['fruit','fruit_type','country', 'id', 'month'])
df
Нужно вывести предыдущую строку предшествующую строке , где месяц=unknown, и если предшествующие строки идут подряд с одинаковым значением fruit_tyue, то нужно вывести все эти предшествующие строки.
Как можно это сделать?
Ожидаемый результат:
Ответы (1 шт):
Шаг 1
Найдем строки, которые предшествующую строке , где month=='unknown'
Здесь стоит использовать метод shift, который позволяет сдвигать индекс.
df[df['month'].shift(-1)=='unknown']
Результат сохраню в столбец unknown_prev, он нам пригодится.
df['unknown_prev'] = df['month'].shift(-1)=='unknown'
Шаг 2
Теперь найдем строки, в которых значение в колонке fruit_type идут подряд. Это нам тоже пригодится в будущем, поэтому сразу сохраню в столбец g
Тут тоже используется метод shift, но как раз просравнивать между собой соседние строки позволяет ne(бинарный !=), cumsum переводит это в численное представление, а точнее возвращает совокупную сумму по столбцу.
df['g'] = df['fruit_type'].ne(df['fruit_type'].shift()).cumsum()
df
Шаг 3
Теперь задача сводится к тому, чтобы вытащить данные, у которых одинаковые g и один из unknown_prev равен True. Я просто сгруппировала по g и нашла максимальный 'unknown_prev' для каждого, а тут выбор невелик или 0(False), или 1(True). Затем просто по сути выбрала нужные колонки:
df[df['g'].map(df.groupby('g')['unknown_prev'].max())]
Осталось только удалить лишние столбцы.
Решение одним куском:
import pandas as pd
import numpy as np
data = {'fruit': ['pear','pear','banana','banana', 'pear', 'pear','apple', 'apple', 'cherry','cherry'],
'fruit_type': ['unknown','pear','unknown','one', 'two', 'one','one', 'apple', 'cherry','unknown'],
'country': ['unknown','usa', 'unknown','usa', 'unknown','ghana','unknown', 'russia', 'albania','bolivia'],
'id': ['022','022','022', '011','011', '011','011', '011', '6','6'],
'month': ['unknown','march', 'unknown', 'october','october', 'january','july', 'unknown', 'january','unknown']
}
df = pd.DataFrame(data, columns = ['fruit','fruit_type','country', 'id', 'month'])
df['unknown_prev'] = df['month'].shift(-1)=='unknown'
df['g'] = df['fruit_type'].ne(df['fruit_type'].shift()).cumsum()
res = df[df['g'].map(df.groupby('g')['unknown_prev'].max())]
res.drop(['unknown_prev', 'g'], axis=1, inplace = True)





