Подсчет появления шаблона в столбце Pandas DataFrame - PullRequest
1 голос
/ 30 апреля 2020

У меня есть Pandas DataFrame со столбцом, где каждая строка содержит список. Мне интересно, каким наиболее эффективным способом / наилучшей практикой было бы определить шаблоны из столбца списков - например, среднее количество отклонений до того, как их приняли. (См. Пример ниже)

    sequence_of_selection
0   Accept,Reject,Reject,Reject,Reject,Accept,Reje...
1   Accept,Reject,Reject,Reject,Reject,Reject,Reje...
2   Reject,Accept,Accept,Reject,Reject,Reject,Acce...
3   Accept,Reject,Accept,Accept,Accept,Accept,Reje...
4   Reject,Accept,Reject,Accept,Reject,Reject,Acce...

Я могу преобразовывать данные в строки и разбивать их или искать подстроки в строке и т. Д., Но я бы предпочел искать более эффективный способ, например Python строки являются неизменными.

Любые предложения / помощь приветствуется.

Скриншот Jupyter

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Это действительно замечательный вопрос! Я хотел бы подчеркнуть мощь во временном интервале событий - здесь так много понимания поведения и предсказуемости, основанного на последовательностях, как один размещен. Учитывая это, я написал длинный ответ, чтобы, надеюсь, объяснить некоторые основные принципы манипулирования данными.

1. Создайте пользовательскую функцию для выполнения ваших расчетов:
(Представьте, что вы подаете заявку только на один список - я бы фактически предложил извлечь один список во время отладки или тестирования)

def event_metrics(my_list, look_for = "Accept", exclude_zeros=True, simple=True):
    """
    Simple mode:
        Returns the average number of `items` before `look_for` 

    Non-Simple mode:
        Returns a dictionary with the mean, median, and max number of `items`
        before `look_for` 

    --
    my_list: a list of values

    look_for: An item in the list which constitutes the "event"
              Example: "accept" from a list of "accept" and "reject"

    exclude_zeros: exclude metrics for when `look_for` occurs back to back

    simple: operate in simple mode or non-simple mode

    """

    # Instantiate a counter list
    my_counter = []
    n = 0

    # Loop through the list
    for x in my_list:

        # If a match, add n to the list and reset
        if x==look_for:
            my_counter.append(n)
            n=0

        # Otherwise, continue
        else:
            n+=1

    # Sometimes you might want to append the final n at conclusion of the loop
    # You could do that with the following code:
    # if x!=look_for:
    #     my_counter.append(n)


    # You may not want to include back-to-back events
    if exclude_zeros:
        my_counter = [x for x in my_counter if x>0]

    # You can return a specific metric such as mean
    if simple:
        return np.mean(my_counter)

    # Or you can pass several metrics as a dictionary and convert to a series
    my_metrics = {
        "mean":np.mean(my_counter),
        "median":np.median(my_counter),
        "max":np.max(my_counter)
    }
    return my_metrics

2. Примените эту пользовательскую функцию к вашему df:

  • Простой режим: возвращает массив отдельных значений - обрабатывать как новый столбец.
  • Непростой режим: возвращает массив словарей - конвертировать в несколько столбцов, используя pd.to_Series. Добавить к оригиналу df используя pd.merge.
# Simple Mode
df["sequence_of_selection"].apply(event_metrics, simple=True)

# Non-Simple Mode
temp_df = df["sequence_of_selection"].apply(event_metrics, simple=False)\
            .apply(pd.Series)\  # Convert to its own df
            .add_prefix("rej_") # Add a prefix to your column names

df.merge(temp_df,left_index=True,right_index=True)
0 голосов
/ 30 апреля 2020

Поскольку они являются списками, вы можете получить index из 'Accept' и затем взять среднее значение этих индексов. Если индекс равен 0, первый элемент в списке - 'Accept', поэтому перед ним стоит ноль 'Reject' и так далее.

df['sequence_of_selection'].apply(lambda x: x.index('Accept')).mean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...