Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在np.where()中将列表元素作为条件?_Python_Python 3.x_Pandas_Numpy_Dataframe - Fatal编程技术网

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

Python 如何在np.where()中将列表元素作为条件?,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,我想基于另一列的值创建一个新列,其中对于在新列中指定的值,需要评估某些条件 我读了一些涉及np.where的问题和答案,但无法推断出最有效的python方法 示例数据帧是: period 0 JAN16 1 YTD JAN16 我想在以下条件下为列period_type赋值: 如果周期以x开始,其中x是列表中的任何元素->[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月],则周期类型=“月”,否

我想基于另一列的值创建一个新列,其中对于在新列中指定的值,需要评估某些条件

我读了一些涉及np.where的问题和答案,但无法推断出最有效的python方法

示例数据帧是:

      period
0      JAN16 
1  YTD JAN16
我想在以下条件下为列period_type赋值: 如果周期以x开始,其中x是列表中的任何元素->[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月],则周期类型=“月”,否则,周期类型=周期。0

我希望数据帧是:

      period period_type
0      JAN16       month
1      JAN16       YTD
我无法在我的代码中应用任何逻辑:

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

一种方法是使用检查哪些行以列表中的任何值开头,它还接受一个字符串元组,并将新列中的行设置为“月”,或将实际行值拆分并取第一个值:

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
带str切片的IIUC-isin


一种方法是使用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
这里的月份是您的月份列表,我们构造一个正则表达式模式,其中“^”表示以开始,然后我们用“|”连接所有列。要说任何以这些模式开始的列,我们可以将其传递给np。在那里构造新列

生成的正则表达式模式是:

In[23]:
'^(' + '|'.join(months) + ')'
Out[23]: '^(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)'
如果将月份创建为整数,则可以得到如下结果

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)

唯一需要注意的是,默认值不能是YTD。它必须是列表的第一个元素,其中l是句点.split创建的列表。@anky_91不知道,也许你能再看看这个问题吗?我刚刚更新了我的问题,预期输出。谢谢你能再看看这个问题吗?我刚刚更新了我的问题,预期输出。谢谢预期的产出是一样的对吗@AviralSrivastavano,我已经更新了我问题中的预期输出。现在是2016年1月,是2016年年初至今的一个月,期间为2016年年初至今。因此,早些时候是年初至今1月16日,但现在是1月16日,2月16日。我希望你抓住我了?我正在从周期值中删除该类型,您可以重新查看该问题吗?我刚刚更新了我的问题,预期输出。Thanks@AviralSrivastava在上面添加df.period=df.period.str.splir''。str[-1]您能重新看一下这个问题吗?我刚刚更新了我的问题,预期输出。谢谢,你的月份不是一个元组吗?谢谢,你能再看看这个问题吗?你可以再加一行,比如df['period']=np。其中df['period_type']='month',df['period'],df['period'],df['period'],df['period'].str.split.str[1]当4个人回答了原来的问题道歉时,你的问题就改了,我对他们中的每一个都做了评论。基本上,你想生成一个新列,然后对第一列进行标准化,对吗?我想提出一个关于如何对第一列进行标准化的新问题。如果你足够早地更新了你的问题,那么我就不会有太多问题,但是你更新了几次,然后有4个人回答了原来的问题。现在你要求我们所有人考虑你的额外要求,这是糟糕的形式。所以,接受一个答案,发布一个新的问题,我同意@EdChum。
In[23]:
'^(' + '|'.join(months) + ')'
Out[23]: '^(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)'
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)