声明一个整数在熊猫系列的列表中

时间:2020-03-27 14:10:04

标签: pandas

我有一个带有两个熊猫系列的DataFrame,如下所示:

     value accepted_values
0      1    [1, 2, 3, 4]
1      2    [5, 6, 7, 8]

我想有效使用熊猫方法检查该值是否在accepted_values中。

我已经知道我可以执行以下操作,但是我对一种更快的方法感兴趣(如果有一种方法(在100万行DataFrame上花费大约27秒的时间)

import pandas as pd

df = pd.DataFrame({"value":[1, 2], "accepted_values": [[1,2,3,4], [5, 6, 7, 8]]})

def check_first_in_second(values: pd.Series):
    return values[0] in values[1]

are_in_accepted_values = df[["value", "accepted_values"]].apply(
    check_first_in_second, axis=1
)

if not are_in_accepted_values.all():
    raise AssertionError("Not all value in accepted_values")

2 个答案:

答案 0 :(得分:1)

我认为如果使用列表列创建DataFrame,则可以按DataFrame.eq进行比较,并按DataFrame.any测试每行是否至少匹配一个值:

df1 = pd.DataFrame(df["accepted_values"].tolist(), index=df.index)
are_in_accepted_values = df1.eq(df["value"]).any(axis=1).all()

另一个想法:

are_in_accepted_values = all(v in a for v, a in df[["value", "accepted_values"]].to_numpy())

答案 1 :(得分:0)

我发现您的第二个想法有些优化。比熊猫使用更多的numpy使它更快(用time.perf_counter()测试,超过3倍)。

values = df["value"].values
accepted_values = df["accepted_values"].values

are_in_accepted_values = all(s in e for s, e in np.column_stack([values, accepted_values]))