将列的值与减小大小的数组(或系列)进行比较

时间:2017-11-17 09:00:47

标签: python pandas numpy vectorization

我有以下数据框。 (这不一定是数据帧; numpy数组df.values上的解决方案也足够了)

np.random.seed(42)
df = pd.DataFrame(np.random.random((10,2)),columns=['a', 'b'])
df

        a           b
0   0.374540    0.950714
1   0.731994    0.598658
2   0.156019    0.155995
3   0.058084    0.866176
4   0.601115    0.708073
5   0.020584    0.969910
6   0.832443    0.212339
7   0.181825    0.183405
8   0.304242    0.524756
9   0.431945    0.291229

我想要包含一个新列,其值具有以下逻辑:

True:如果特定b值之后的任何a值大于该partiulcar a 错误:否则

预期产量为: (参见下面某些行的解释)

       a           b      c
0   0.374540    0.950714  True
1   0.731994    0.598658  True
2   0.156019    0.155995  True
3   0.058084    0.866176  True   <- np.any(0.058084 < np.array([0.708073, 0.969910, 0.212339, 0.183405, 0.524756, 0.291229]))
4   0.601115    0.708073  True   <- np.any(0.601115 < np.array([0.969910, 0.212339, 0.183405, 0.524756, 0.291229]))
5   0.020584    0.969910  True   <- np.any(0.020584 < np.array([0.212339, 0.183405, 0.524756, 0.291229]))
6   0.832443    0.212339  False  <- np.any(0.832443 < np.array([0.183405, 0.524756, 0.291229]))
7   0.181825    0.183405  True   <- np.any(0.181825 < np.array([0.524756, 0.291229]))
8   0.304242    0.524756  False  <- np.any(0.304242  < np.array([0.291229]))
9   0.431945    0.291229  UNDEFINED <- Ignore this

上面应该可以使用for循环但是pandas / numpy方法是什么?

我正在尝试将lambda函数应用于a的方法,但我无法找到相应的a值的索引来执行np.any的方法比较如上所示。 (我后来发现apply只是for循环的语法糖,但是)

df['c'] = df['a'].apply(lambda x: np.any(x < df['b'].values[<i>:])) # Where <i> is the respective index value of x; which I didn't know how to find

2 个答案:

答案 0 :(得分:2)

诀窍是从def get_streams_per_client(proto='tcp', max=40000): s = Search(using=client, index="packets-2017-09-25") \ .query("match", transport_protocol=proto) s.aggs.bucket('clients', 'terms', field='layers.ip.src.keyword', size=max, order={"num_servers.value":"desc"})\ .bucket('num_servers', 'cardinality', field='layers.ip.dst.keyword', precision_threshold=40000)\ .bucket('server_list', 'terms', field='layers.ip.dst.keyword') s = s.execute() <snip> 开始自下而上查找累积的最大值,并将其与b中的相应值进行比较。

因此,实施将是 -

a

移植到a = df.a.values b = df.b.values out = a[:-1] < np.maximum.accumulate(b[::-1])[::-1][1:] pandas的对应部分为df.cummax

示例运行 -

np.maximum.accumulate

答案 1 :(得分:1)

为了补充@Divakar的答案,使用cummax()的pandas方法将是:

df['c'] = df['a'] < df['b'][::-1].cummax()[::-1].reset_index(drop=True).shift(-1)

print(df)  

        a         b      c
0  0.374540  0.950714   True
1  0.731994  0.598658   True
2  0.156019  0.155995   True
3  0.058084  0.866176   True
4  0.601115  0.708073   True
5  0.020584  0.969910   True
6  0.832443  0.212339  False
7  0.181825  0.183405   True
8  0.304242  0.524756  False
9  0.431945  0.291229  False