繁体   English   中英

查找嵌套子列表中的值是否大于 Pandas 列中的 X

[英]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使用列表理解。 anymax快,因为它在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM