Допустим, у меня есть следующий фрейм данных:
df = pd.DataFrame({"id": [1, 1, 1, 2, 2, 2, 3, 3, 3, 3], "date": [pd.Timestamp(2002, 2, 2), pd.Timestamp(2003, 3, 3), pd.Timestamp(2004, 4, 4), pd.Timestamp(2005, 5, 5), pd.Timestamp(2006, 6, 6), pd.Timestamp(2007, 7, 7), pd.Timestamp(2008, 8, 8), pd.Timestamp(2009, 9, 9), pd.Timestamp(2010, 10, 10), pd.Timestamp(2011, 11, 11)], "numeric": [0.9, 0.4, 0.2, 0.6, np.nan, 0.8, 0.7, np.nan, np.nan, 0.5], "nominal": [0, 1, 0, 1, 0, 0, 0, 1, 1, 1]})
Чего я хочу добиться - это обрезать строки в конце каждой группы (при условии, что строки сгруппированы по id
)так, что строки будут удаляться до тех пор, пока для столбца numeric
не появится значение non-nan
.Кроме того, последняя строка для каждой группы всегда будет иметь значение non-nan
для столбца numeric
, а последнюю строку всегда следует удалять.Итак, результирующий фрейм данных:
result_df = pd.DataFrame({"id": [1, 1, 2, 3], "date": [pd.Timestamp(2002, 2, 2), pd.Timestamp(2003, 3, 3), pd.Timestamp(2005, 5, 5), pd.Timestamp(2008, 8, 8)], "numeric": [0.9, 0.4, 0.6, 0.7], "nominal": [0, 1, 1, 0]})
Дополнительные пояснения о том, как мы получаем результирующий фрейм данных:
- Для
id == 1
удаляется только последняя строкапоскольку в строке перед последней имеется значение для столбца numeric
. - Для
id == 2
последние две строки удаляются, поскольку последняя строка по умолчанию удаляется строкой, предшествующей последнейa nan
value. - Для
id == 3
последние три строки удаляются, поскольку последняя строка удаляется по умолчанию, а первое значение non-nan
находится в четвертой строке, считая снизу.
Более того, в настоящее время я делаю следующее:
df.groupby("id", as_index=False).apply(lambda x: x.iloc[:-1]).reset_index(drop=True)
Однако это удаляет только последнюю строку для каждой группы, и я хочу удалить последние N
строки на основе объясненного условия.выше.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация и с нетерпением ждем ваших ответов!