我有以下数据框。 (这不一定是数据帧; 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
答案 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