[英]Find if value in nested sublist is greater than X within Pandas Column
数据框:
col1
[[0.43], [0.46], [1.0], [0.323]]
[[0.33], [0.66], [1.0], [0.3412]]
[[0.27], [0.42], [0.13], [0.332]]
我正在尝试基于以下条件创建一列:如果col11
>= .5 的嵌套列表中有一个数字, col11
“是”,否则为“否”。
结果:
col1 col2
[[0.43], [0.46], [1.0], [0.323]] yes
[[0.33], [0.66], [1.0], [0.3412]] yes
[[0.27], [0.42], [0.13], [0.332]] no
有一列数字在嵌套列表中的位置 >= .5 也很好。 对于上述 df,这将是col3: 3,3,N/A
思考这样的事情:
for i in df.col1:
print(i)
if j in i >= .05:
print(i,"yes")
else:
print(i,"no")
你可以做
sub_df = df[pd.DataFrame(df['col1'].apply(lambda x : sum(x,[])).tolist()).ge(0.5).any(1).values]
一个简单的apply
应该做
df['col2'] = df['col1'].apply(lambda x: max(e[0] for e in x) > 0.5)
输出
col1 col2
0 [[0.43], [0.46], [1.0], [0.323]] True
1 [[0.33], [0.66], [1.0], [0.3412]] True
2 [[0.27], [0.42], [0.13], [0.332]] False
对any
使用列表理解。 any
比max
快,因为它在True
上短路
df['col2'] = [any(y[0] >= 0.5 for y in x) for x in df.col1]
Out[1815]:
col1 col2
0 [[0.43], [0.46], [1.0], [0.323]] True
1 [[0.33], [0.66], [1.0], [0.3412]] True
2 [[0.27], [0.42], [0.13], [0.332]] False
一些时间:
df = pd.concat([df]*10000, ignore_index=True)
In [1820]: %timeit [any(y[0] >= 0.5 for y in x) for x in df.col1]
41.2 ms ± 1.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [1823]: %timeit df['col1'].apply(lambda x: max(e[0] for e in x) >= 0.5)
51.9 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
使用max
边测试列表理解
In [1827]: %timeit [max(y[0] for y in x) >= 0.5 for x in df.col1]
49.9 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
所以, any
更快,但并不重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.