Используйте дубликаты перетаскивания в Pandas DF, но выберите сохранить столбец на основе списка предпочтений - PullRequest
0 голосов
/ 05 августа 2020

У меня есть фрейм данных со многими столбцами. Есть столбец datetime, и есть повторяющиеся записи для datetime с данными для этих дубликатов, поступающих из разных источников. Я хотел бы удалить дубликаты на основе column "dt", но я хочу сохранить результат на основе того, что находится в column "pref". Ниже я привел упрощенные данные, но причина этого в том, что у меня также есть столбец значений, а столбец "Pref" является источником данных. Я предпочитаю определенные источники данных, но мне нужна только одна запись на дату (column "dt"). Я бы хотел, чтобы этот код работал, чтобы мне не приходилось указывать полный список настроек.

Искусственный код данных

import pandas as pd
import numpy as np

 df=pd.DataFrame({'dt':[1,1,1,2,2,3,3,4,4,5],
        "Pref":[1,2,3,2,3,1,3,1,2,3],
        "Value":np.random.normal(size=10),
        "String_col":['A']*10})
df

Out[1]: 
   dt  Pref     Value  String_col
0   1     1 -0.479593  A
1   1     2  0.553963  A
2   1     3  0.194266  A
3   2     2  0.598814  A
4   2     3 -0.909138  A
5   3     1 -0.297539  A
6   3     3 -1.100855  A
7   4     1  0.747354  A
8   4     2  1.002964  A
9   5     3  0.301373  A

Желаемый результат 1 (СЛУЧАЙ 1):

В этом случае мой список предпочтений имеет значение полностью. Я предпочитаю источник данных 2, за которым следует 1, но я возьму 3, если это все, что у меня есть.

preference_list=[2,1,3]

Out[2]: 
   dt  Pref     Value  String_col
1   1     2  0.553963  A
3   2     2  0.598814  A
5   3     1 -0.297539  A
8   4     2  1.002964  A
9   5     3  0.301373  A

Желаемый результат 2 (СЛУЧАЙ 2)

В этом случае я просто хочу найти источник данных 1. Если его нет, мне все равно, что это за другой источник данных.

preference_list2=[1]

Out[3]: 
   dt  Pref     Value  String_col
0   1     1 -0.479593  A
3   2     2  0.598814  A
5   3     1 -0.297539  A
7   4     1  0.747354  A
9   5     3  0.301373  A

Я могу представить, что делаю это очень медленно и сложный l oop, но я чувствую, что должна быть команда для выполнения sh этого. Еще одна важная вещь: Мне нужно сохранить некоторые другие текстовые столбцы во фрейме данных, чтобы .agg мог вызвать проблемы с этими метаданными. Я экспериментировал с сортировкой и использованием аргумента keep в drop_duplicates, но безуспешно.

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Вы действительно ищете сортировку по категориям, что можно сделать с помощью pd.Categorical:

df["Pref"] = pd.Categorical(df["Pref"], categories=preference_list, ordered=True)

print (df.sort_values(["dt","Pref"]).drop_duplicates("dt"))

   dt Pref     Value String_col
1   1    2 -1.004362          A
3   2    2 -1.316961          A
5   3    1  0.513618          A
8   4    2 -1.859514          A
9   5    3  1.199374          A
0 голосов
/ 05 августа 2020

вот очень эффективное и простое решение, надеюсь поможет!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


df=pd.DataFrame({'dt':[1,1,1,2,2,3,3,4,4,5],
        "Pref":[1,2,3,2,3,1,3,1,2,3],
        "Value":np.random.normal(size=10),
        "String_col":['A']*10})

preference_list = [2,3]

df_clean = df[df['Pref'].isin(preference_list)]
print(df)
print(df_clean)

Output:
  dt  Pref     Value String_col
0   1     1  1.404505          A
1   1     2  0.840923          A
2   1     3 -1.509667          A
3   2     2 -1.431240          A
4   2     3 -0.576142          A
5   3     1 -1.208514          A
6   3     3 -0.456773          A
7   4     1  0.574463          A
8   4     2 -1.682750          A
9   5     3  0.719394          A
   dt  Pref     Value String_col
1   1     2  0.840923          A
2   1     3 -1.509667          A
3   2     2 -1.431240          A
4   2     3 -0.576142          A
6   3     3 -0.456773          A
8   4     2 -1.682750          A
9   5     3  0.719394          A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...