Как получить элементы списка в качестве условия в np.where ()? - PullRequest
0 голосов
/ 02 мая 2019

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

Я прочитал несколько вопросов и ответов ( Numpy np.where множественное условие ) с участием np.where(), но не смог вывести лучший (эффективный) Pythonic способ.

Пример кадра данных:

      period
0      JAN16 
1  YTD JAN16

Я хочу присвоить значения столбцу period_type при следующем условии: если точка начинается с x (где x - любой элемент списка -> ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', ' SEP ',' OCT ',' NOV ',' DEC ']), затем period_type =' month ', иначе, period_type = period.split (0)

Я бы хотел, чтобы датафрейм был:

      period period_type
0      JAN16       month
1      JAN16       YTD

Я не могу применить какую-либо логику в своем коде:

df.loc[df['c1'] == 'Value', 'c2'] = 10

Или:

df['c2'] = np.where(df.c1 == 8,'X',df.c3)

Ответы [ 4 ]

3 голосов
/ 02 мая 2019

IIUC isin с str срезом

np.where(df.period.str[:3].isin(l),'month',df.period.str.split(' ').str[0])
Out[1162]: array(['month', 'YTD'], dtype=object)

df['period_type'] = np.where(df.period.str[:3].isin(l),'month',df.period.str.split(' ').str[0])
3 голосов
/ 02 мая 2019

Один из методов заключается в использовании str.contains и передаче шаблона регулярного выражения:

In[22]:
df['period_type'] = np.where(df['period'].str.contains('^(' + '|'.join(months) + ')') , 'month', df['period'].str.split().str[0])
df


Out[22]: 
      period period_type
0      JAN16       month
1  YTD JAN16         YTD
2  L3M FEB19         L3M

Здесь months - ваш список месяцев, мы создаем шаблон регулярного выражения, где '^' означает, что начинается с, затеммы соединяем все столбцы с '|', чтобы сказать, что любой начинается с любого из этих шаблонов, затем мы можем передать его в np.where для создания нового столбца.

Сгенерированный шаблон регулярного выражения:

In[23]:
'^(' + '|'.join(months) + ')'
Out[23]: '^(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)'
3 голосов
/ 02 мая 2019

Одним из способов является использование str.startswith для проверки того, какие строки начинаются с любого из значений в списке (он также принимает кортеж строк), и np.where установить для строк в новом столбце значение month или фактическое значение строки разделить и принять первое значение:

l = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 
     'AUG', 'SEP', 'OCT', 'NOV', 'DEC']

m = df.period.str.startswith(tuple(l))
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]

   period   period_type
0  JAN16       month
1  JAN16         YTD
1 голос
/ 02 мая 2019

Если вы создадите месяцы как tuple, вы можете получить его следующим образом

import pandas as pd
import numpy as np
d = {'period' : ['JAN16', 'YTD JAN16', 'FEB18', 'YEAR DEC']}
df = pd.DataFrame(d)
months = ('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC')
df['period_type'] = np.where(df['period'].str.startswith(months), 'month', df['period'].str.split().str[0] )
df['period'] = np.where(df['period_type'] == 'month', df['period'], df['period'].str.split().str[1] )
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...