我想基于另一列的值创建一个新列,在该列中,要评估在新列中分配的值的某些条件。
我阅读了一些涉及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)
答案 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)