Как вложить numpy () в np.where или один за другим? - PullRequest
2 голосов
/ 03 мая 2019

У меня есть фрейм данных, в котором мне нужно добавить столбец на основе определенного условия. Я успешно делаю это ( Как использовать элементы списка в качестве условия в np.where ()? ). Однако, когда я применяю одну и ту же логику дважды, она не работает.

мой фрейм данных:

period period_type
JAN16 month
JAN16 YTD
2017 2017

Вместо этого я хочу: 2017 annual. Тем не менее, я получаю annual для всех значений, то есть месяцев, с начала года и т. Д. Меняются на годовые. Блок кода:

def add_period_type(df):
    months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
    m = df.period.str.startswith(tuple(months))
    df['period_type'] = np.where(m, 'month', df.period.str.split().str[0])
    df.loc[~m, 'period'] = df.loc[~m, 'period'].str.split().str[1]
    df["period"] = df["period"].combine_first(df["period_type"])
    years = [str(x) for x in range(2000, 2100)]
    y = df.period.str == (tuple(years))
    print(y)
    df['period_type'] = np.where(y, 'annual', df.period_type.str)
    return df

В первые 3-4 строки добавляется новый столбец period_type. Затем я хочу немного изменить этот столбец на основе вышеупомянутого условия (проверьте, является ли значение годом, и, если это так, присваивает ежегодный тип period_type. Вместо этого код thbis не работает, он присваивает annual всем .

1 Ответ

2 голосов
/ 03 мая 2019

Использование np.select():

str = """period
JAN16
YTD JAN16 
2017"""

# sample dataframe
df = pd.read_csv(pd.io.common.StringIO(str))

months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
years = [ '{}'.format(x) for x in range(2000, 2100)]

# condition for month
m = df.period.str[:3].isin(months)

# condition for annual 
y = df.period.isin(years)

# if contains spaces, then do JAN16, YTD
n = df.period.str.contains('\s')

df['period_type'] = np.select([m, y, n], ['month', 'annual', df.period.str.split().str[::-1].str.join(', ')])
df
#      period period_type
#0      JAN16       month
#1  YTD JAN16  JAN16, YTD
#2       2017      annual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...