Создать новый столбец на основе правила данных Pandas - PullRequest
1 голос
/ 11 мая 2019

Привет, я наткнулся на проблему с пандами данных. У меня есть этот фрейм данных.

user    event   diff days
1001    request    45
1001    approve    43
1002    request    44
1002    approve    43
1002    request    42
1003    approve    41
1003    request    40
1003    approve    39
1003    request    38

Я хотел бы создать новый столбец Флаг на основе этого правила: мы определяем Проблему как не выполняющую другой запрос в течение 45 дней после последнего запроса для каждого пользователя.

Вывод должен выглядеть следующим образом.

user    event   diff Days   flag
1001    request    45       Problem
1001    approve    43       Problem
1002    request    44       NoProblem
1002    approve    43       NoProblem
1002    request    42       NoProblem
1003    approve    41       NoProblem
1003    request    40       NoProblem
1003    approve    39       NoProblem
1003    request    38       NoProblem

Я не могу найти решение, используя np.where или np.select . Любые виды решений приветствуются.

Если вы хотите поэкспериментировать с этим, вы можете использовать это для воспроизведения моего вышеупомянутого кадра данных.

df = pd.DataFrame(data={'user': [1001, 1001, 1002, 1002, 1002, 1003, 1003, 1003, 1003],
                           'event': ['request', 'approve', 'request', 'approve', 'request', 'approve', 'request', 'approve', 'request'],
                           'Diff Days': [45, 43, 44, 43, 42, 41, 40, 39, 38]})

N.B. Мне нужно помечать как проблему только те случаи, когда мы не делаем еще один запрос в течение 45 дней после последнего запроса (дни в столбцах) для каждого пользователя и события (я имею в виду только запрос). Остальные поля из события не играют роли.

1 Ответ

1 голос
/ 11 мая 2019

EDIT:

В комментариях вы сказали, что хотите пометить пользователей, где event равно request и Diff Days >= 45. Вот как:

users_with_problems = df.loc[(df["event"] == "request") & (df["Diff Days"] >= 45), "users"]
df["Flag"] = "No problem"
df.loc[df["user"].isin(users_with_problem), "Flag"] = "Problem"

Конец редактирования.

Кажется, вы хотите, чтобы Flag отображал Problem через все строки пользователя, у которого была одна проблема. Для этого:

df["Flag"] = "No problem"
users_with_problem = df.loc[df["Diff Days"] >= 45, "user"]
df.loc[df["user"].isin(users_with_problem), "Flag"] = "Problem"

Возвращает:

user    event  Diff Days        Flag
1001  request         45     Problem
1001  approve         43     Problem
1002  request         44  No problem
1002  approve         43  No problem
1002  request         42  No problem
1003  approve         41  No problem
1003  request         40  No problem
1003  approve         39  No problem
1003  request         38  No problem

Однако вы сказали, что хотите пометить проблему, только если diff - 45 или более. Вы можете сделать это следующим образом:

df["Flag"] = "No Problem"
df.loc[df["Diff Days"] >= 45, "Flag"] = "Problem"

Это помечает пользователей только в тех строках, где diff >= 45:

user    event  Diff Days        Flag
1001  request         45     Problem
1001  approve         43  No problem
1002  request         44  No problem
1002  approve         43  No problem
1002  request         42  No problem
1003  approve         41  No problem
1003  request         40  No problem
1003  approve         39  No problem
1003  request         38  No problem
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...