Несколько Elifs на основе разных факторов - PullRequest
0 голосов
/ 17 января 2019

У меня есть pands df с int столбцами year, month и day.Я хотел бы создать новый столбец df.is_payday наиболее питонным способом, который равен 1, если df.day равен 20 или 30, иначе 0.

Однако в некоторых месяцах нет 30дней, поэтому в этих случаях я бы хотел, чтобы df.is_payday имел 1 только тогда, когда df.day равен 20 или 29, иначе 0.

Однако в некоторых месяцах даже нет 28 дней, поэтому в этих случаяхЯ бы хотел, чтобы df.is_payday имел 1 только тогда, когда df.day равен 20 или 28, иначе 0.

Может ли это быть сделано с использованием списка?Можно ли это также сделать с помощью модулей календаря или даты и времени, основанных на некотором количестве дней месяца?

РЕДАКТИРОВАТЬ

Я успешно использовал приведенный ниже код, хотя мне бы хотелось использовать что-то более питоническое:

lst = []
for i,k in zip(df['day'], df['month_total_days']):
    if i == 20 | i == 30 & k >= 30:
        lst.append(1)
    elif i == 20 | i == 29 & k == 29:
        lst.append(1)
    elif i == 20 | i == 28 & k == 28:
        lst.append(1)
    else:
        lst.append(0)
df['is_payday'] = lst

1 Ответ

0 голосов
/ 17 января 2019

Я думаю, вы можете использовать np.where, чтобы найти, где df.day равно 20, и чтобы получить значение 28, 29 и 30, в зависимости от случая, это на самом деле, где df.day равно df.month_total_days, за исключением случаев, когда df.month_total_days больше 30, так что вы можете использовать pd.clip_upper, например, чтобы иметь 30 вместо любого значения более.

import numpy as np

df['is_payday'] = np.where( (df.day == 20) | 
                            (df.day == df.month_total_days.clip_upper(30), 1, 0)
...