我有一个数据框,需要根据特定条件在其中添加一列。我已成功完成此操作(How to have list's elements as a condition in np.where()?)。但是,当我两次应用相同的逻辑时,它将不起作用。
我的datframe是:
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分配为year。相反,thbis代码不起作用,它分配annual
所有人。
答案 0 :(得分:2)
使用style.css
:
np.select()
答案 1 :(得分:1)
在性能方面,我发现嵌套的np.where语句通常比np.select更好(尽管在更大的尺寸下np.select看起来也一样)。
import numpy as np
import pandas as pd
sizes = [100,10000,1000000]
for n in sizes:
x = np.random.randint(9, size=n)
y = np.random.randint(2, size=n)
z = np.random.choice(['N','Y'],size=n)
c = [((y == 0) & (z == 'Y')),((y != 0) & (z == 'Y')),((y != 0) & (z == 'N'))]
o = [x,x * 2,x * 3]
%timeit np.select(c,o,0)
%timeit np.where(c[0],o[0],np.where(c[1],o[1],np.where(c[2],o[2],0)))
38.2 µs ± 281 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.43 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
167 µs ± 1.45 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
88.4 µs ± 909 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
15.9 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.9 ms ± 181 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)