如何在np.where()中将列表的元素作为条件?

时间:2019-05-02 13:58:26

标签: python python-3.x pandas numpy dataframe

我想基于另一列的值创建一个新列,在该列中,要评估在新列中分配的值的某些条件。

我阅读了一些涉及np.where()的问题和答案(Numpy np.where multiple condition),但无法推断出最佳(有效)的Python方式。

示例数据帧为:

      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 个答案:

答案 0 :(得分:3)

一种方法是使用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 :(得分:3)

具有isin分片的IIUC 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])

答案 2 :(得分:3)

一种方法是使用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 :(得分:1)

如果您将月份创建为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)