#python #pandas #dataframe #numpy #vectorization
#питон #панды #фрейм данных #тупица #векторизация
Вопрос:
Я работаю с неполными данными, в которых также есть двойники, и мне нужно очистить их от двойников, выбрав полные строки, если они доступны.
Например: вот как выглядят данные
Мне нужно выполнить поиск по каждой строке, чтобы увидеть, является ли она двойной (имеет «ранг» gt;1), и является ли она неполной сама по себе, но имеет несколько полных двойников. Сейчас я все объясню:
- не в каждой строке с «рангом» = 1 есть дата (это критично), но у некоторых из них есть двойники («ранг» gt;1), в которых есть дата.
- не в каждой строке есть двойник. И если в нем нет даты, это нормально.
Итак, мне нужно найти двойник с датой, если он существует, и переписать его в строку с рангом 1 (или удалить неполную первую строку). В конце концов, мне нужно иметь фрейм данных без двойников и столько дат, сколько доступно.
Есть мой код с КРАЙНЕ неэффективным итерационным циклом, но я не знаю, как его переписать с помощью векторизации или метода .apply() :
def test_func(dataframe): df = dataframe df.iloc[0:0] for i in range(0, dataframe.shape[0]): if dataframe.iloc[i]['rank'] == 1: temp_row = dataframe.iloc[i] elif ((dataframe.iloc[i 1]['rank']gt;1)amp; (pd.isna(dataframe.iloc[i]['date']) amp;(~pd.isna(dataframe.iloc[i 1]['date'])))): temp_row = dataframe.iloc[i 1] df.loc[i] = temp_row return df
Надеюсь найти какую-нибудь помощь! Из России с любовью старпом.
Комментарии:
1. Таким образом, ваш конечный кадр данных должен иметь только 1-й ранг ? (либо потому, что у них уже была дата, либо потому, что она была получена из ранга gt; 1) Я прав?
2. Я сбрасываю ранги в final df, я использую их только для того, чтобы помочь мне отсортировать двойников, но да, самое важное-найти и добавить дату, если она находится в строке с рангом gt;1
Ответ №1:
Предполагая, что вы группируетесь по телефону и заинтересованы в заполнении пропущенных дат, вы можете использовать обратную заливку и сгруппировать по, что заполнит пропущенные даты следующей доступной не нулевой датой в группе.
test_df['date'] = test_df.groupby(['phone'])['date'].apply(lambda x: x.bfill())
если вам нужно заполнить другие отсутствующие данные, просто замените «дата» соответствующим именем столбца