Python сгруппировать и найти первую последовательность, соответствующую критерию - PullRequest
0 голосов
/ 25 мая 2020

Итак, я новичок, и я нашел много сообщений о том, как найти первую последовательность, которая соответствует критерию, но я не знаю, как объединить ее с функцией «группировать по» и отобразить ее в новом столбце.

Мне нужно сгруппировать данные по столбцу «Группа» и найти первое значение, которое> 0, и многократно отображать его в столбце «Сейчас» в каждой строке группы.

Ввод:

df_input = pd.DataFrame({
    "Group": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C"],
    "Value": [0, 1, 0, 3, 5, 0, 2, 4, 4, 0, 3, 0]
})

Вывод:

df_output = pd.DataFrame({
    "Group": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C"],
    "Value": [0, 1, 0, 3, 5, 0, 2, 4, 4, 0, 3, 0],
    "First sequence": [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3]
})

1 Ответ

0 голосов
/ 25 мая 2020

Следующий код решает вашу проблему, как вы ее описали.

import pandas as pd
import numpy as np

df_input = pd.DataFrame({
    "Group": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C"],
    "Value": [0, 1, 0, 3, 5, 0, 2, 4, 4, 0, 3, 0]
})

def greater_than(array, lower_bound=1):
    condition_fulfiled = (array > lower_bound)
    is_greater = condition_fulfiled.any()

    if is_greater:
        return array[np.argmax(condition_fulfiled)]
    else:
        return None


df_input_grouped = df_input.groupby("Group")
df_input_grouped = df_input_grouped.agg([greater_than])


df_input["First sequence"] = None

for group, value in zip(df_input_grouped.index, df_input_grouped.Value.greater_than):
    df_input["First sequence"][df_input.Group==group] = value

df_input

Если вы хотите получить результат из своего результата data frame, вам просто нужно изменить функцию greater_than на

def greater_than(array, lower_bound=1):
    condition_fulfiled = (array >= lower_bound)
    is_greater = condition_fulfiled.any()

    if is_greater:
        return array[np.argmax(condition_fulfiled)]
    else:
        return None
...