如何嵌套numpy()的np.where或另一个嵌套?

时间:2019-05-02 23:50:53

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

我有一个数据框,需要根据特定条件在其中添加一列。我已成功完成此操作(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所有人。

2 个答案:

答案 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)