Эффективное сравнение строк в фрейме данных pandas на основе неполных данных

#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())  

если вам нужно заполнить другие отсутствующие данные, просто замените «дата» соответствующим именем столбца